#c# #exchangewebservices
#c# #exchangewebservices
Вопрос:
Я пытаюсь найти назначение, используя глобальный UID. Я заранее знаю, каким будет глобальный UID (его можно задать при создании назначения).
Я создал ExtendedPropertyDefinition, сославшись на этот URL http://msdn.microsoft.com/en-us/library/cc815676 (v=office.15).aspx.
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 в двоичный объект. Возможно, это другой объект (см. Комментарии ниже). Но я могу настроить фильтр поиска с расширенным свойством. В приведенном ниже коде я просто сохраняю объект «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[]));
Ответ №1:
Вы используете неправильный MapiPropertyType. globalId — это двоичное свойство, а не строка. EWS обрабатывает их в SOAP с помощью строк Base64. Я считаю, что расширенные свойства двоичного типа будут отображаться в виде массива байтов, поэтому, если вы получаете / устанавливаете двоичное расширенное свойство, вам может потребоваться выполнить преобразование Base64 самостоятельно, если это необходимо. Если у вас уже есть строка Base64, то никаких проблем. Определите расширенное свойство как двоичное и используйте строку Base64 в фильтре поиска. EWS должен сделать все остальное.
Ах, извините, я пропустил это. Вы проверяете DefaultExtendedPropertySet.Appointment . Вместо этого оно должно быть DefaultExtendedPropertySet.Meeting. Если вы пытаетесь таким образом установить глобальный уникальный идентификатор, то вместо этого вы устанавливаете «новое» расширенное свойство. Вы не можете установить GlobalUniqueID. Exchange может не выдать ошибку, если вы попытаетесь, но это не значит, что он выполнил то, что вы просили его сделать. GlobalUniqueID генерируется на основе даты / времени встречи. Оно может совпадать с идентификатором ICalUid (раньше я не знал, что они могут совпадать, поэтому прошу прощения), но не обязательно. Посмотрите на различия между GlobalUniqueID и CleanGlobalUniqueID. Я не знаю, можно ли установить сам ICalUid отдельно от этого, но я сомневаюсь в этом. Если вы хотите выполнить поиск по любому из них, вам нужно будет создать назначение, затем загрузить требуемые расширенные свойства и сохранить их в другом месте для поиска или задать собственное расширенное свойство с вашим собственным идентификатором и выполнить поиск по нему.
Комментарии:
1. Исправление MapiType позволило мне вернуть объект обратно в ItemView. Однако у меня все еще возникают проблемы с кодировкой. Запускаю преобразование. ToBase64String в возвращаемом byte[] выдает строку, которая не похожа на значение, содержащееся в ICalUid .
2. ICalUid и Глобальный уникальный идентификатор — это не одно и то же свойство. У них будут разные значения.
3. Я почти уверен, что они одинаковы. Ознакомьтесь с разделом 4.1.2.1 MS-OXOCAL.pdf msdn.microsoft.com/en-us/library/cc425490 (v=exchg.80).aspx . Приведенные там значения выглядят так же, как и ICalUid.
Ответ №2:
Я полагаю, что проблема в том, что ваш PropertySet не включает ваше ExtendedPropertyDefinition. Поэтому, когда вы вызываете FindItemsResults, для поиска не загружаются расширенные значения свойств. Итак, измените:
view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
Для
view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, epICalId);
Просмотр пользовательских расширенных свойств с помощью управляемого API EWS является хорошим ресурсом, если это не исправит проблему.