【问题标题】:Get All Contacts using Lync ContactManager使用 Lync ContactManager 获取所有联系人
【发布时间】:2011-07-24 12:32:45
【问题描述】:

现在我正在使用 LyncClient.ContactManager.BeginSearch 方法来查找联系人。但是,我无法弄清楚如何获得所有联系人。我尝试将“*”和“%”作为通配符传递,但没有奏效。现在这是我的函数调用。

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

【问题讨论】:

标签: c# lync-2010 lync


【解决方案1】:

Lync 联系人被组织成组,因此您需要从组级别开始。一旦你有了一个组,你就可以枚举它的联系人

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

This article 适合做背景,更高级的功能

编辑:具体来说,对于通讯组扩展问题,我认为样本here 有缺陷。

提供一个回调方法来处理 Expand 回调,而不是调用 BeginExpand 并等待 WaitHandle。所以,而不是:

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...
}

这对我来说非常适合。

【讨论】:

  • 我使用 BeginSearch 方法来获取组,并使用每个人的电子邮件地址搜索通讯组。它返回正确的通讯组,但集合中没有返回联系人。
  • 您是否尝试过使用 SearchOptions.IncludeContactsWithoutSipOrTelUri 而不是 SearchOptions.ContactsOnly 进行搜索?
  • IncludeContactsWithoutSipOrTelUri 有相同的结果。我尝试使用 MS 站点上的示例扩展通讯组,但它只是挂在 asyncOpResult.AsyncWaitHandle.WaitOne() 上并且永远不会完成 (msdn.microsoft.com/en-us/library/gg436849.aspx)。该小组应该有大约 200 人,但 MS 链接只说 1,000+ 应该有问题
  • 我用解决方案编辑了答案。不确定 UCMA 选项,但希望您现在不需要走那条路
  • 我使用了这个代码,但它只适用于较小的群体。我从 Microsoft.Lync.Model.Internal.CBWBase.BlockUntilDone() 的 EndExpand 方法中得到一个 OperationException。我也尝试使用 BeginGetAllMembers 方法,得到了相同的结果。它适用于较小的团体(一个有 90 名成员),但不适用于大约 200 人的团体。我也遇到了同样的错误。我想也许它可能与 MaxSizeGroupSize 在这里展开属性有关social.technet.microsoft.com/Forums/en-US/ocsclients/thread/…
【解决方案2】:

我最终进行了多次搜索以获取所有联系人。我遍历字母表中的每个字母来找到它们。加载时间足够快,当它启动时,我将在网格上显示加载图像一会儿。这对于我们拥有的 200 个左右的联系人来说效果很好,尽管我会推荐 Paul 的解决方案用于 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.
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多