尝试使用扩展属性查找EWS约会

时间:2014-06-23 22:37:03

标签: c# exchangewebservices

我正在尝试使用全局UID找到约会。我知道全局UID将提前是什么(可以在创建约会时设置)。

我通过引用此URL http://msdn.microsoft.com/en-us/library/cc815676(v=office.15).aspx创建了ExtendedPropertyDefinition。

        var service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
        service.Credentials = new NetworkCredential("","","");
        service.Url = new Uri("");
        ExtendedPropertyDefinition epICalId = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Appointment, 3, MapiPropertyType.String);
        ItemView view = new ItemView(50);
        view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
        view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
        FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Calendar, new SearchFilter.IsEqualTo(epICalId, "CustomUID123"), view);
        var x = findResults.TotalCount;

问题是没有会议返回。有什么想法吗?

我仍然无法将ICalUID转换为二进制对象。它可能是一个不同的对象(见下面的评论)。但我可以使用Extended属性设置搜索过滤器。在下面的代码中,我只需保存“temp”对象并重新使用它进行搜索。

        var PROP_DEF_PidLidGlobalObjectId = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Meeting, 0x00000003, MapiPropertyType.Binary);
        appt.Load(new PropertySet(BasePropertySet.FirstClassProperties, PROP_DEF_PidLidGlobalObjectId);
        object temp;
        appt.TryGetProperty(PROP_DEF_PidLidGlobalObjectId, out temp);
        var sf2 = new SearchFilter.IsEqualTo(PROP_DEF_PidLidGlobalObjectId, Convert.ToBase64String(temp as byte[]));

2 个答案:

答案 0 :(得分:1)

您使用了错误的MapiPropertyType。 GlobalID是二进制属性,而不是字符串。 EWS使用Base64字符串处理SOAP。我相信二进制类型的扩展属性将作为字节数组来实现,因此如果您正在获取/设置二进制扩展属性,您可能需要自己处理Base64转换(如果需要)。如果您已经有Base64字符串,那么没问题。将扩展属性定义为二进制,并在搜索过滤器中使用Base64字符串。 EWS应该完成剩下的工作。

啊,对不起,我错过了。您正在检查DefaultExtendedPropertySet.Appointment。它应该是DefaultExtendedPropertySet.Meeting。如果您尝试以这种方式设置全局唯一ID,那么您需要设置一个&#34; new&#34;扩展财产而不是。您无法设置GlobalUniqueID。如果你尝试,交易所可能不会抛出错误,但这并不意味着它做了你要求它做的事情。 GlobalUniqueID基于约会的日期/时间生成。它可能与ICalUID匹配(我之前没有意识到它们可以匹配,所以道歉),但不一定。查看GlobalUniqueID和CleanGlobalUniqueID之间的差异。我不知道ICalUID本身是否可以与之分开,但我对此表示怀疑。如果要搜索其中任何一个,您需要创建约会,然后加载所需的扩展属性并将其保留在其他地方进行搜索,或者使用您自己的标识符设置您自己的扩展属性并搜索它。 / p>

答案 1 :(得分:0)

我认为问题是你的PropertySet没有包含你的ExtendedPropertyDefinition。因此,当您调用FindItemsResults时,没有加载扩展属性值来搜索。所以改变:

view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties); 

view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, epICalId); 

Viewing custom extended properties by using the EWS Managed API是一个很好的资源,如果它没有解决它。