Ошибка при попытке прочитать/обновить .Body задачи через EWS Managed API - "Вы должны загрузить или назначить это свойство, прежде чем сможете прочитать его значение".
Я использую управляемый API веб-служб Exchange для работы с задачами (Exchange 2007 SP1). Я могу их создать. Однако, когда я пытаюсь сделать обновления, он работает для всех полей, кроме поля .Body. Всякий раз, когда я пытаюсь получить доступ (чтение/обновление) этого поля, он дает следующую ошибку:
"You must load or assign this property before you can read its value."
Используемый мной код выглядит следующим образом:
//impersonate the person whose tasks you want to read
Me.Impersonate(userName); //home-made function to handle impersonation
//build the search filter
Exchange.SearchFilter.SearchFilterCollection filter = New Exchange.SearchFilter.SearchFilterCollection();
filter.Add(New Exchange.SearchFilter.IsEqualTo(Exchange.TaskSchema.Categories, "Sales"));
//do the search
EWS.Task exTask = esb.FindItems(Exchange.WellKnownFolderName.Tasks, filter, New Exchange.ItemView(Integer.MaxValue));
exTask.Subject = txtSubject.Text; //this works fine
exTask.Body = txtBody.Text; //This one gives the error implying that the object isn't loaded
Странно, что проверка пакета свойств показывает, что объект содержит 33 свойства, но {Body} не является одним из них. Это свойство кажется унаследованным от базового класса. Это или что-то.
Итак, нужно ли повторно загружать объект как элемент типа? Или перезагрузите его через. Имейте в виду, что мне нужно делать это с тысячами предметов, поэтому эффективность имеет значение для меня.
Ответы
Ответ 1
У меня была такая же проблема при использовании EWS. Мой код запрашивает события (Назначения) из
Календарь Outlook, в конце я не смог добраться до тела самого события.
Недопустимый момент в моей ситуации был следующим: "Простите, если есть ошибки опечатки":
После сбора Назначений, которые также получены из класса предметов EWS, я сделал следующее:
1- Создайте список с типом Item:
List<Item> items = new List<Item>();
2- Добавлены все встречи в список элементов:
if(oAppointmentList.Items.Count > 0) // Prevent the exception
{
foreach( Appointment app in oAppointmentList)
{
items.Add(app);
}
}
3- Используется служба обмена "Я уже создал и использовал":
oExchangeService.LoadPropertiesForItems(items, PropertySet.FirstClassProperties);
теперь, если вы попытаетесь использовать app.Body.Text, он вернет его успешно.
Наслаждайтесь кодированием и удачей
Я забыл упомянуть ресурс:
http://social.technet.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/ce1e0527-e2db-490d-817e-83f586fb1b44
Он упомянул использование Linq для сохранения промежуточного шага, это поможет вам избежать использования элементов списка и сохранить некоторую память!
RockmanX
Ответ 2
Вызов метода Load решил мою проблему:)
foreach (Item item in findResults.Items)
{
item.Load();
string subject = item.Subject;
string mailMessage = item.Body;
}
Ответ 3
Вы можете загрузить свойства с помощью настраиваемого набора свойств. Некоторые свойства - это расширенные свойства вместо FirstClassProperties.
Маленький пример:
_customPropertySet = new PropertySet(BasePropertySet.FirstClassProperties, AppointmentSchema.MyResponseType, AppointmentSchema.IsMeeting, AppointmentSchema.ICalUid);
_customPropertySet.RequestedBodyType = BodyType.Text;
appointment.Load(_customPropertySet);