Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果联系人位于GAL中,则Exchange Web Service(EWS)FindItems不工作_C#_.net_Exchange Server_Exchangewebservices_Gal - Fatal编程技术网

C# 如果联系人位于GAL中,则Exchange Web Service(EWS)FindItems不工作

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方法,该方法效果良好。对于过滤器,我使用用户的电子邮件地址,这是一个很好的关键。。。如果我得到一个结果,这仅仅意味着联系人已经存在,我需要进行更新

我创建了一个从外部源获取联系人对象的小应用程序。然后,根据某些配置,我必须在exchange服务器上的用户联系人文件夹中创建/升级这些联系人,以便该用户下次打开其MS Outlook时,在exchange服务器上看到新联系人,我有一个具有模拟功能的用户,因此安全性不受关注

为此,我使用EWS库的FindItemsfolderId、filter、view方法,该方法效果良好。对于过滤器,我使用用户的电子邮件地址,这是一个很好的关键。。。如果我得到一个结果,这仅仅意味着联系人已经存在,我需要进行更新而不是创建。在这里之前,一切都按预期进行

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

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

当然,问题是,当联系人已经存在于GAL中时,我如何知道它是否存在于exchange文件夹中

当前代码:

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);
有了这段代码,一切都按预期进行