如果联系人在 GAL 中,Exchange Web 服务 (EWS) FindItems 将不起作用

Posted

技术标签:

【中文标题】如果联系人在 GAL 中,Exchange Web 服务 (EWS) FindItems 将不起作用【英文标题】:Exchange Web Service (EWS) FindItems does not work if contact is in GAL 【发布时间】:2013-09-25 08:35:42 【问题描述】:

我创建了一个从外部来源获取Contact 对象的小应用程序。然后,根据某些配置,我必须在我们的交换服务器上的用户联系人文件夹中创建/更新这些联系人,以便下次该用户打开其 MS Outlook 时,他会看到新联系人(在交换服务器上,我有具有模拟能力的用户,因此安全性不是问题)。

为此,我使用了 EWS 库的 FindItems(folderId, filter, view) 方法,效果很好。对于过滤器,我使用的是用户的电子邮件地址,这是一个很好的键......如果我得到一个结果,这仅仅意味着 Contact 已经存在,我需要这样做更新而不是创建。一切都按预期工作,直到这里......

但是,当 Contact(实际上是电子邮件地址)已经存在于 GAL(全局地址列表)中时,我遇到了一个问题。在这种情况下,即使文件夹中存在 ContactFindItems 方法也不会返回任何结果!似乎(这是一个假设)交换服务器为联系人创建了一个链接,这些联系人的电子邮件地址已经存在于 GAL 中,而不是新联系人。这可以解释为什么 FindItems 方法在这种情况下不返回任何内容。 奇怪的是,如果我过滤另一个属性(例如名字和姓氏的组合),它会起作用!

目前,发生的情况是,对于 GAL 中已经存在的每个 Contact,都会完成创建而不是更新(因为 FindItems 方法不返回任何内容),结果,相同的联系人被创建 X 次(而不是被创建一次,然后更新 X-1 次)。

问题当然是,当一个联系人已经存在于 GAL 中时,我怎么知道它是否存在于一个交换文件夹中?

当前代码:

ItemView view = new ItemView(5)

   PropertySet = new PropertySet(BasePropertySet.FirstClassProperties)
;
SearchFilter f = new SearchFilter.IsEqualTo(ContactSchema.EmailAddress1, email);
FindItemsResults<Item> contactItems = _service.FindItems(folderId, f, view);
int resultCount = contactItems.Count(); // Always 0 if GAL, otherwise it works

【问题讨论】:

【参考方案1】:

最后,我通过使用SetExtendedProperty 方法解决了扩展属性的问题。在这个扩展字段中,我只是输入了一个Id,这就解决了问题。

但这并不能解释为什么搜索无法使用电子邮件地址...如果有人知道答案,我仍然感兴趣:)

新的搜索看起来像这样:

ItemView view = new ItemView(nb);
view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, _extendedPropDef);
SearchFilter f = new SearchFilter.IsEqualTo(_extendedPropDef, contact.Id);
FindItemsResults<Item> contactItems = _service.FindItems(folderId, f, view);

使用此代码,一切都按预期工作......

【讨论】:

以上是关于如果联系人在 GAL 中,Exchange Web 服务 (EWS) FindItems 将不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为 Exchange 2010 用户添加联系人头像

Exchange2016将用户头像发布到全局地址列表(GAL)

Exchange HAB创建

将 GAL 中的联系人导入 Office 365 中的用户帐户

如何使用 EWS Java API (Exchange Web Service) 设置联系人标题?

配置Exchange 2016分层通讯薄(HAB)