Получить все контакты с помощью Lync ContactManager

Прямо сейчас я использую метод LyncClient.ContactManager.BeginSearch для поиска контактов. Однако я не смог понять, как получить все контакты. Я пробовал передавать "*" и "%" как подстановочные знаки, но это не сработало. Прямо сейчас вот мой вызов функции.

_lyncClient.ContactManager.BeginSearch("*", SearchProviders.GlobalAddressList, SearchFields.DisplayName, SearchOptions.ContactsOnly, 400, SearchCallback, "Searching Contacts");

person skeletank    schedule 28.03.2011    source источник
comment
Вот ссылка на мой пост на форуме MS относительно ограничений размера DistributionGroup для BeginExpand и BeginGetAllMembers: 524a-45db-a544-16e4f3a5a693" rel="nofollow noreferrer">social.msdn.microsoft.com/Forums/en-US/communicatorsdk/thread/   -  person skeletank    schedule 31.03.2011


Ответы (2)


Контакты Lync организованы в группы, поэтому вам нужно начать с уровня групп. После того, как у вас есть группа, вы можете перечислить ее контакты

foreach(var group in _client.ContactManager.Groups)
{
    foreach (var contact in group)
    {
        MessageBox.Show(contact.Uri);
    }
}

Эта статья хороша для ознакомления с дополнительными функциями.

Изменить. В частности, для вопроса о расширении групп рассылки я думаю, что образец здесь ошибочен.

Вместо вызова BeginExpand и ожидания WaitHandle предоставьте метод обратного вызова для обработки обратного вызова Expand. Итак, вместо:

asyncOpResult = DGGroup.BeginExpand(null, null);
asyncOpResult.AsyncWaitHandle.WaitOne();

DGGroup.EndExpand(asyncOpResult);

попробуй это:

...
asyncOpResult = DGGroup.BeginExpand(ExpandCallback, DGGroup);
...

public void ExpandCallback(IAsyncResult ar)
{
    DistributionGroup DGGroup = (DistributionGroup)ar.AsyncState;
    DGGroup.EndExpand(ar);

    etc...
}

Это отлично работает для меня.

person Paul Nearney    schedule 28.03.2011
comment
Вместо этого я использовал метод BeginSearch для получения групп и искал группу рассылки со всеми адресами электронной почты. Он возвращает правильную группу рассылки, но в коллекции нет контактов. - person skeletank; 28.03.2011
comment
Пробовали ли вы искать с помощью SearchOptions.IncludeContactsWithoutSipOrTelUri вместо SearchOptions.ContactsOnly? - person Paul Nearney; 28.03.2011
comment
IncludeContactsWithoutSipOrTelUri дал тот же результат. Я попытался расширить группу рассылки, используя образец на сайте MS, но он просто завис на asyncOpResult.AsyncWaitHandle.WaitOne() и никогда не заканчивался (msdn.microsoft.com/en-us/library/gg436849.aspx). В группе должно быть около 200 человек но по ссылке МС написано только что с 1000+ должны быть проблемы - person skeletank; 28.03.2011
comment
Я отредактировал ответ с решением. Не уверен насчет варианта UCMA, но надеюсь, вам не придется идти по этому пути сейчас. - person Paul Nearney; 29.03.2011
comment
Я использовал этот код, но он работал только с небольшими группами. Я получаю исключение OperationException из метода EndExpand из Microsoft.Lync.Model.Internal.CBWBase.BlockUntilDone(). Я также попытался использовать метод BeginGetAllMembers и получил те же результаты. Это сработает для небольших групп (одна из 90 участников), но не с группой из 200 человек. Я также получал ту же ошибку. Я думаю, возможно, это может быть связано с свойством MaxSizeGroupSize для расширения здесь /" rel="nofollow noreferrer">social.technet.microsoft.com/Forums/en-US/ocsclients/thread/ - person skeletank; 29.03.2011
comment
Звучит как ошибка или ограничение в этом вызове. Я бы попытался позвонить в службу поддержки MS, если вы можете - person Paul Nearney; 29.03.2011
comment
Я определенно отмечу это как правильный способ сделать что-то, хотя я собираюсь использовать свой метод, пока не получу ответ от MS. - person skeletank; 30.03.2011
comment
Круто - дайте нам знать, если вы получите окончательный ответ - person Paul Nearney; 31.03.2011
comment
Я получил ответ от своего сообщения на форуме, и похоже, что SDK ограничен ограничением на сервере в 150 пользователей. - person skeletank; 15.04.2011
comment
Не по теме: можно ли получить контакт ALIAS вместо URI? - person Angshuman Agarwal; 12.03.2017

В итоге я сделал несколько поисков, чтобы получить все контакты. Я просматриваю каждую букву алфавита, чтобы найти их. Время загрузки достаточно быстрое, и я просто покажу загрузочное изображение в сетке на некоторое время, когда оно запустится. Это хорошо сработало для 200 или около того контактов, которые у нас есть, хотя я бы рекомендовал решение Пола для 150 или меньше. Вот что я сделал:

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.
  }
}
person skeletank    schedule 29.03.2011