C# 如果联系人位于GAL中,则Exchange Web Service(EWS)FindItems不工作
我创建了一个从外部源获取联系人对象的小应用程序。然后,根据某些配置,我必须在exchange服务器上的用户联系人文件夹中创建/升级这些联系人,以便该用户下次打开其MS Outlook时,在exchange服务器上看到新联系人,我有一个具有模拟功能的用户,因此安全性不受关注 为此,我使用EWS库的FindItemsfolderId、filter、view方法,该方法效果良好。对于过滤器,我使用用户的电子邮件地址,这是一个很好的关键。。。如果我得到一个结果,这仅仅意味着联系人已经存在,我需要进行更新而不是创建。在这里之前,一切都按预期进行 但是,当联系人电子邮件地址实际上已经存在于GAL全局地址列表中时,我遇到了一个问题。在这种情况下,即使文件夹中存在联系人,FindItems方法也不会返回任何结果!这似乎是一种假设,exchange服务器为GAL中已存在电子邮件地址而不是新联系人的联系人创建链接。这可以解释为什么FindItems方法在这种情况下不返回任何内容。奇怪的是,如果我对另一个属性进行过滤,例如对first和lastname的组合进行过滤,它会工作 目前,发生的情况是,对于GAL中已经存在的每个联系人,都会进行创建而不是更新,因为FindItems方法不返回任何内容,因此,相同的联系人会被创建X次,而不是创建一次,然后更新X-1次 当然,问题是,当联系人已经存在于GAL中时,我如何知道它是否存在于exchange文件夹中 当前代码:C# 如果联系人位于GAL中,则Exchange Web Service(EWS)FindItems不工作,c#,.net,exchange-server,exchangewebservices,gal,C#,.net,Exchange Server,Exchangewebservices,Gal,我创建了一个从外部源获取联系人对象的小应用程序。然后,根据某些配置,我必须在exchange服务器上的用户联系人文件夹中创建/升级这些联系人,以便该用户下次打开其MS Outlook时,在exchange服务器上看到新联系人,我有一个具有模拟功能的用户,因此安全性不受关注 为此,我使用EWS库的FindItemsfolderId、filter、view方法,该方法效果良好。对于过滤器,我使用用户的电子邮件地址,这是一个很好的关键。。。如果我得到一个结果,这仅仅意味着联系人已经存在,我需要进行更新
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
最后,我使用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);
有了这段代码,一切都按预期进行