我创建了一个小应用程序,它从外部源获取 Contact 对象。然后,根据一些配置,我必须在我们的Exchange服务器上的用户联系人文件夹中创建/更新这些联系人,以便下次该用户打开其MS Outlook时,他会看到新的联系人(在Exchange服务器上,我有具有模拟功能的用户,因此安全性不是问题。)
为此,我使用了运行良好的EWS库的FindItems(folderId, filter, view)
方法。对于过滤器,我使用的是用户的电子邮件地址,这是一个非常好的关键...如果我得到一个结果,这只是意味着联系人已经存在,我需要做更新而不是创建。一切都按预期运作,直到这里...
但是,当GAL(全球地址列表)中已存在联系人(实际上是电子邮件地址)时,我遇到了问题。在这种情况下,即使文件夹中存在 Contact ,FindItems
方法也不会返回结果!似乎(这是一个假设)交换服务器为联系人创建一个链接,该联系人的电子邮件地址已经存在于GAL中,而不是新的联系人。这可以解释为什么FindItems
方法在这种情况下不会返回任何内容。 奇怪的是,如果我在另一个属性上过滤(例如在first和lastname的组合上),它就可以了!
目前,发生的情况是,对于GAL中已存在的每个 Contact ,创建而不是更新(因为FindItems
方法不返回任何内容),并且作为结果,X时间创建相同的联系人(而不是创建一次,然后更新X-1时间。)
问题当然是,如果GAL中已存在 Contact ,是否存在于交换文件夹中?
当前代码:
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
答案 0 :(得分:0)
最后,我使用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);
使用此代码,一切都按预期工作......