web-dev-qa-db-fra.com

Erreur lorsque j'essaie de lire / mettre à jour le .Body d'une tâche via EWS Managed API - "Vous devez charger ou affecter cette propriété avant de pouvoir lire sa valeur."

J'utilise l'API gérée des services Web Exchange pour travailler avec les tâches (Exchange 2007 SP1). Je peux bien les créer. Cependant, lorsque j'essaie de faire des mises à jour, cela fonctionne pour tous les champs à l'exception du champ .Body. Chaque fois que j'essaie d'accéder (lire/mettre à jour) à ce champ, cela donne l'erreur suivante:

"You must load or assign this property before you can read its value."

Le code que j'utilise ressemble à ceci:

   //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

Ce qui est étrange, c'est que l'inspection du sac de propriétés montre que l'objet contient 33 propriétés, mais {Body} n'en fait pas partie. Cette propriété semble être héritée de la classe de base .Item, ou quelque chose.

Alors, dois-je recharger l'objet en tant que type Item? Ou le recharger via .Bind ou quelque chose? Gardez à l'esprit que je dois le faire avec des milliers d'articles, donc l'efficacité compte pour moi.

36
tgolisch

J'ai eu le même problème lors de l'utilisation du serveur Web intégré. Mon code demande les événements (rendez-vous) au

Calendrier Outlook, à la fin, je ne pouvais pas atteindre le corps de l'événement lui-même.

Le point manquant dans ma situation était le suivant "pardonnez-moi s'il y a des erreurs de frappe":

Après avoir rassemblé les rendez-vous, qui sont également dérivés de la classe d'objets EWS, j'ai fait ce qui suit:

1- Créez une liste avec le type Item:

List<Item> items = new List<Item>();

2- Ajout de tous les rendez-vous à la liste des articles:

if(oAppointmentList.Items.Count > 0) // Prevent the exception
{
    foreach( Appointment app in oAppointmentList)
    {
        items.Add(app);
    }
}

3- Utilisation du service échangé "J'ai déjà créé et utilisé":

oExchangeService.LoadPropertiesForItems(items, PropertySet.FirstClassProperties);

maintenant, si vous essayez d'utiliser app.Body.Text, il le renverra avec succès.

Profitez du codage et de la meilleure chance

J'ai oublié de mentionner la ressource:

http://social.technet.Microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/ce1e0527-e2db-490d-817e-83f586fb1b44

Il a mentionné l'utilisation de Linq pour enregistrer l'étape intermédiaire, cela vous aidera à éviter d'utiliser les éléments de la liste et à économiser de la mémoire!

RockmanX

42
RocmanX

L'appel de la méthode Load a résolu mon problème :)

foreach (Item item in findResults.Items)
        {                
            item.Load();
            string subject = item.Subject;
            string mailMessage = item.Body;
        }
55
hasianjana

Vous pouvez charger des propriétés à l'aide d'un jeu de propriétés personnalisé. Certaines propriétés sont des propriétés étendues au lieu de FirstClassProperties.

Petit exemple:

 _customPropertySet = new PropertySet (BasePropertySet.FirstClassProperties, AppointmentSchema.MyResponseType, AppointmentSchema.IsMeeting, AppointmentSchema.ICalUid); 
 _customPropertySet.RequestedBodyType. ); 
5
eL-Prova