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

本文关键字:查找 EWS 约会 属性 扩展 | 更新日期: 2023-09-27 18:10:10

我正在尝试使用全局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[]));

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

您正在使用错误的MapiPropertyType。GlobalID是一个二进制属性,而不是字符串。EWS用Base64字符串在SOAP中处理这些。我相信二进制类型的扩展属性会以字节数组的形式出现,所以如果您要获取/设置二进制扩展属性,可能需要自己处理Base64转换。如果您已经有Base64字符串,那么没有问题。将扩展属性定义为二进制,并在搜索筛选器中使用Base64字符串。EWS应该做剩下的。

啊,对不起,我错过了。你在检查defaultextendedpropertyset。appointment。它应该是DefaultExtendedPropertySet。会议。如果你试图以那种方式设置全局唯一ID,那么你会设置一个"new"扩展属性。不能设置GlobalUniqueID。如果您尝试,Exchange可能不会抛出错误,但这并不意味着它执行了您要求它执行的操作。GlobalUniqueID是根据Appointment的日期/时间生成的。它可能匹配ICalUID(我之前没有意识到它们可以匹配,所以很抱歉),但不一定。看看GlobalUniqueID和CleanGlobalUniqueID之间的区别。我不知道ICalUID本身是否可以与它分开设置,但我怀疑它。如果您希望在其中的任何一个上进行搜索,则需要创建Appointment,然后加载所需的扩展属性并将其保留在其他地方进行搜索,或者使用您自己的标识符设置您自己的扩展属性并在其上进行搜索。

我认为问题是你的PropertySet不包括你的ExtendedPropertyDefinition。所以当你调用FindItemsResults时没有加载要搜索的扩展属性值。所以修改:

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

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

使用EWS Managed API查看自定义扩展属性是一个很好的资源,如果这还不能解决问题的话。