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