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.
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:
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
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;
}
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. );