2010-07-21 11 views
26

Estoy usando la API administrada de servicios web de Exchange para trabajar con tareas (Exchange 2007 SP1). Puedo crearlos bien. Sin embargo, cuando intento hacer actualizaciones, funciona para todos los campos, excepto para el campo .Body. Siempre que trato de acceso (lectura/actualización) ese campo, se da el siguiente error:Error al intentar leer/actualizar el .Body de una tarea mediante la API administrada de EWS: "Debe cargar o asignar esta propiedad antes de poder leer su valor".

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

El código que estoy utilizando el siguiente aspecto:

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

Lo extraño es que, la inspección de la bolsa de propiedades muestra que el objeto contiene 33 propiedades, pero {Cuerpo} no es una de ellas. Esa propiedad parece ser heredada de la clase base .Item, o algo así.

Entonces, ¿necesito volver a cargar el objeto como tipo Artículo? ¿O volver a cargarlo a través de .Bind o algo así? Tenga en cuenta que necesito hacer esto con miles de elementos, por lo que la eficiencia sí me importa.

Respuesta

34

Tuve el mismo problema cuando uso el EWS. Mi código está solicitando los eventos (citas) desde el

calendario de Outlook, al final no pude llegar al cuerpo del evento en sí.

El punto que falta en mi situación era la siguiente "perdóname si hay cualquier error de typo":

Después de reunir las citas, que también se derivan de EWS clase de artículo, hice lo siguiente:

1- Crear una lista con el tipo de artículo:

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

2- añadido todas las citas a la lista de artículos:

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

3- utilizado el servicio intercambiado "Ya he creado y utilizado":

oExchangeService.LoadPropertiesForItems(items, PropertySet.FirstClassProperties); 

ahora si intenta utilizar app.Body.Text, volverá con éxito.

Disfrute de Codificación y Mejor suerte

me olvidó mencionar el recurso:

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

Mencionó el uso de LINQ para salvar el paso intermedio, que le ayudará a evitar el uso de los elementos de la lista y ahorra algo de memoria!

RockmanX

4

Puede cargar propiedades mediante un conjunto de propiedades personalizadas. Algunas propiedades son propiedades extendidas en lugar de FirstClassProperties.

pequeño ejemplo:

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

Al llamar al método de carga resuelto mi problema :)

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

trabajó como un encanto! – NoReceipt4Panda

Cuestiones relacionadas