Ошибка при попытке прочитать / обновить тело задачи через управляемый API EWS: «Вы должны загрузить или назначить это свойство, прежде чем сможете прочитать его значение». - PullRequest
33 голосов
/ 22 июля 2010

Я использую управляемый API-интерфейс веб-служб Exchange для работы с задачами (Exchange 2007 с пакетом обновления 1). Я могу создать их хорошо. Однако, когда я пытаюсь сделать обновления, это работает для всех полей, кроме поля .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} не является одним из них. Это свойство, кажется, унаследовано от базового класса .Item или чего-то еще.

Итак, мне нужно повторно загрузить объект как тип Item? Или перезагрузить через .Bind или что-то? Имейте в виду, что мне нужно сделать это с тысячами предметов, поэтому эффективность имеет значение для меня.

Ответы [ 3 ]

50 голосов
/ 04 октября 2013

Вызов метода Load решил мою проблему:)

foreach (Item item in findResults.Items)
        {                
            item.Load();
            string subject = item.Subject;
            string mailMessage = item.Body;
        }
40 голосов
/ 25 июля 2010

У меня была такая же проблема при использовании EWS.Мой код запрашивает события (встречи) из календаря Outlook

, в конце я не смог добраться до самого тела события.

Недостающим моментом в моей ситуации былпосле "прости меня, если есть какие-либо опечатки":

После сбора назначений, которые также являются производными от класса элементов EWS, я сделал следующее:

1- Создайте список сtype 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

5 голосов
/ 23 августа 2012

Вы можете загрузить свойства, используя пользовательский набор свойств. Некоторые свойства являются расширенными свойствами вместо FirstClassProperties.

Маленький пример:

        _customPropertySet = new PropertySet(BasePropertySet.FirstClassProperties, AppointmentSchema.MyResponseType, AppointmentSchema.IsMeeting, AppointmentSchema.ICalUid);
        _customPropertySet.RequestedBodyType = BodyType.Text;
        appointment.Load(_customPropertySet);
...