Ottieni tutti i contatti utilizzando Lync ContactManager
Domanda
In questo momento sto usando il metodo LyncClient.ContactManager.beginsearch per trovare contatti. Tuttavia, non sono stato in grado di capire come ottenere tutti i contatti. Ho provato a passare "*" e "%" come personaggi jolly ma non ha funzionato. In questo momento ecco la mia chiamata di funzione.
_lyncClient.ContactManager.BeginSearch("*", SearchProviders.GlobalAddressList, SearchFields.DisplayName, SearchOptions.ContactsOnly, 400, SearchCallback, "Searching Contacts");
Soluzione
I contatti di Lync sono organizzati in gruppi, quindi è necessario iniziare a livello di gruppi. Una volta che hai un gruppo, puoi quindi elencare i suoi contatti
foreach(var group in _client.ContactManager.Groups)
{
foreach (var contact in group)
{
MessageBox.Show(contact.Uri);
}
}
Questo articolo è buono per lo sfondo e funzionalità più avanzate
Modificare: In particolare, per la domanda di espansione dei gruppi di distribuzione, penso il campione qui è imperfetto.
Invece di chiamare Beginexpand e aspettare sul waithandle, fornire un metodo di callback per gestire il callback di espansione. Quindi, invece di:
asyncOpResult = DGGroup.BeginExpand(null, null);
asyncOpResult.AsyncWaitHandle.WaitOne();
DGGroup.EndExpand(asyncOpResult);
prova questo:
...
asyncOpResult = DGGroup.BeginExpand(ExpandCallback, DGGroup);
...
public void ExpandCallback(IAsyncResult ar)
{
DistributionGroup DGGroup = (DistributionGroup)ar.AsyncState;
DGGroup.EndExpand(ar);
etc...
}
Questo funziona perfettamente per me.
Altri suggerimenti
Ho finito per fare più ricerche per ora per ottenere tutti i contatti. Passo attraverso ogni lettera dell'alfabeto per trovarli. Il tempo di carico è abbastanza veloce e mostrerò solo un'immagine di caricamento sulla griglia per un po 'quando si accende. Questo ha funzionato bene per i circa 200 contatti che abbiamo, tuttavia, consiglierei la soluzione di Paul per 150 o meno. Ecco cosa ho fatto:
private static char[] Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
...
public void GetAllContacts()
{
int initialLetterIndex = 0;
_lyncClient.ContactManager.BeginSearch(
Alphabet[initialLetterIndex].ToString();
SearchProviders.GlobalAddressList,
SearchFields.FirstName,
SearchOptions.ContactsOnly,
300,
SearchAllCallback
new object[] { initialLetterIndex, new List<Contact>() }
);
}
private void SearchAllCallback(IAsyncResult result)
{
object[] parameters = (object[])result.AsyncState;
int letterIndex = (int)parameters[0] + 1;
List<Contact> contacts = (List<Contact>)parameters[1];
SearchResults results = _lyncClient.ContactManager.EndSearch(result);
contacts.AddRange(results.Contacts);
if (letterIndex < Alphabet.Length)
{
_lyncClient.ContactManager.BeginSearch(
Alphabet[letterIndex].ToString(),
SearchAllCallback,
new object[] { letterIndex, contacts }
);
}
else
{
//Now that we have all the contacts
//trigger an event with 'contacts' as the event arguments.
}
}