2013-09-25 49 views
1

我创建了一个小型应用程序,获取联系从外部源对象。然后,根据一些配置,我要创建/ upadate在用户的联系人文件夹这些接触我们的Exchange服务器上,那么该用户打开它的MS Outlook的下一次,他看到了新的联系人(在Exchange服务器上,我有具有模拟能力的用户,所以安全性不是问题)。的Exchange Web服务(EWS)FindItems不工作,如果接触是在GAL

对于这一点,我使用EWS库工作良好的FindItems(folderId, filter, view)方法。对于过滤器,我使用的是用户的电子邮件地址,这是一个相当不错的关键...如果我得到一个结果回来了,这只是意味着联系已经存在,那我需要做一个更新,而不是创建。一切正常,直到这里......

,但我遇到当联系(实际上是电子邮件地址)在GAL(全局地址列表)已经存在的一个问题。在这种情况下,FindItems方法返回即使联系的文件夹中不存在任何结果!看起来(这是假设)交换服务器为联系人创建一个链接,该联系人的电子邮件地址已经存在于GAL中,而不是新的联系人。这可以解释为什么FindItems方法在这种情况下不返回任何东西。 奇怪的是,如果我在另一个属性上进行过滤(例如在第一个和最后一个名字的组合上),它就可以工作!

目前,什么情况是,每个联系已经在GAL存在,创造而非更新完成(因为FindItems方法返回任何内容),以及作为结果,同样联系被创建X时间(而不是创建一次Beeing,然后更新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 

回答

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); 

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

相关问题