Comprobar los resultados de una llamada EWS o API administrada de EWS

Obtenga más información sobre cómo comprobar los resultados de sus llamadas de API administrada por EWS o EWS.

Cuando las cosas no funcionan correctamente, es útil ver lo que está ocurriendo examinando las solicitudes SOAP que su aplicación envía a través de la red y las respuestas que el servidor envía de vuelta. El artículo sobre las herramientas y recursos para solucionar problemas de las aplicaciones EWS incluye los vínculos a las herramientas para ayudar a capturar y ver esas solicitudes SOAP. Después de recibir las solicitudes y las respuestas, ¿cómo puede comprobar que la solicitud que envió al servidor se procesó correctamente? Sigue leyendo para descubrirlo.

Si va a enviar solicitudes EWS, iniciará la comprobación comprobando el atributo ResponseClass para cada mensaje de respuesta de la respuesta. Esto le indicará si la operación se completó correctamente en cada elemento.

Según el objeto al que su método llame, si usa la API administrada EWS para enviar solicitudes, puede realizar una comprobación con la ayuda de los objetos de respuesta. Pero dado que la respuesta SOAP contiene un superconjunto de lo que se incluye en los objetos de respuesta de la API administrada EWS, es posible que también quiera ver la respuesta SOAP. Dado que la respuesta SOAP a menudo puede contener más información que los objetos de respuesta de la API administrada EWS, inicie la comprobación con la respuesta SOAP.

Comprobar los resultados de una respuesta SOAP

Cuando recibe una respuesta SOAP, lo primero que debe tener en cuenta es el atributo ResponseClass. Este atributo se incluye en cada instancia ResponseMessageType del elemento ResponseMessages, como se muestra en el ejemplo siguiente.

<s:Body>
      <m:GetItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
        <m:ResponseMessages>
          <m:GetItemResponseMessage ResponseClass="Success">
          …

Dado que una respuesta SOAP puede contener varios mensajes de respuesta en una única respuesta SOAP, es importante comprobar cada mensaje de respuesta individualmente.

Si está trabajando con una operación que incluye ResponseClass como parte de la respuesta de la operación, como la siguiente, puede que tenga la tentación de comprobar solo ResponseClass de la operación.

<soap:Body>
  <m:AddDelegateResponse xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
                         ResponseClass="Success"
                         xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages">
  …

Sin embargo, el estado de la operación solo refleja la forma de la respuesta de nivel superior y no refleja el estado de todas las respuestas de mensajes individuales. En el siguiente ejemplo, la operación AddDelegateResponse tiene una ResponseClass de Success, pero el elemento DelegateUserResponseMessageType subyacente tiene un valor ResponseClass de Error.

<soap:Body>
  <m:AddDelegateResponse xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
                         ResponseClass="Success"
                         xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages">
    <m:ResponseCode>NoError</m:ResponseCode>
    <m:ResponseMessages>
      <m:DelegateUserResponseMessageType ResponseClass="Error">
        <m:MessageText>The user is already a delegate for the mailbox.</m:MessageText>
        <m:ResponseCode>ErrorDelegateAlreadyExists</m:ResponseCode>
        <m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>
      </m:DelegateUserResponseMessageType>
    </m:ResponseMessages>
  </m:AddDelegateResponse>
</soap:Body>

Por lo tanto, para las respuestas SOAP EWS, no puede confiar en la ResponseClass de la operación. Debe examinar la ResponseClass de cada mensaje de respuesta para determinar si la operación encontró algún error al procesar los elementos.

Comprobar el éxito

Si cada atributo ResponseClass para cada atributo ResponseMessage se establece en el valor Success, la operación se completa correctamente en todos los elementos y puede pasar a la siguiente tarea.

En el ejemplo siguiente se muestra una respuesta correcta a una solicitud de operación GetItem para recuperar un solo elemento. Tenga en cuenta que cuando ResponseClass se establece en Success, el ResponseCode asociado siempre se establece en NoError.

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <m:GetItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
        <m:ResponseMessages>
          <m:GetItemResponseMessage ResponseClass="Success">
            <m:ResponseCode>NoError</m:ResponseCode>
            <m:Items>
              <t:Message>
                <t:ItemId Id="Er5bAAA=" 
                          ChangeKey="CQAAABYAAAD32nSTjepyT63rYH17n9THAAAhE0/M" />
                <t:Subject>Dinner Party</t:Subject>
              </t:Message>
            </m:Items>
          </m:GetItemResponseMessage>
        </m:ResponseMessages>
      </m:GetItemResponse>
    </s:Body>

A continuación se muestra una respuesta correcta a una solicitud de operación GetItem para recuperar varios elementos. Cada uno de los elementos GetItemResponseMessage tiene una ResponseClass de Success.

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <m:GetItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                     xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
    <m:ResponseMessages>
      <m:GetItemResponseMessage ResponseClass="Success">
        <m:ResponseCode>NoError</m:ResponseCode>
        <m:Items>
          <t:Message>
            <t:ItemId Id="Er5bAAA=" 
                      ChangeKey="CQAAABYAAAD32nSTjepyT63rYH17n9THAAAhE0/M" /
            <t:Subject>Dinner Party</t:Subject>
          </t:Message>
        </m:Items>
      </m:GetItemResponseMessage>
      <m:GetItemResponseMessage ResponseClass="Success">
        <m:ResponseCode>NoError</m:ResponseCode>
        <m:Items>
          <t:Message>
            <t:ItemId Id="3c66AAA="
                      ChangeKey="CQAAABYAAAD32nSTjepyT63rYH17n9THAAAc3kqm" />
            <t:Subject>Company Soccer Team</t:Subject>
          </t:Message>
        </m:Items>
      </m:GetItemResponseMessage>
    </m:ResponseMessages>
  </m:GetItemResponse>
</s:Body>

Controlar los errores y las advertencias

Cuando recibe una respuesta y el atributo ResponseClass se establece en Error, la operación no se ha completado correctamente en uno o varios elementos. Corrija el problema y vuelva a intentar la solicitud, o la parte de la solicitud que ha fallado. Un valor de atributo ResponseClass de valor Warning solo lo devuelve por la operación ResolveNames e indica que la entidad no se pudo resolver en una identidad única. Puede omitirlo para todas las demás operaciones.

En la siguiente respuesta, el atributo ResponseClass tiene el valor Error.

<m:GetItemResponseMessage ResponseClass="Error">
  <m:MessageText>Property is not valid for this object type.</m:MessageText>
  <m:ResponseCode>ErrorInvalidPropertyRequest</m:ResponseCode>
  <m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>
  <m:MessageXml>
    <t:FieldURI FieldURI="meeting:AssociatedCalendarItemId" />
  </m:MessageXml>
  <m:Items />
</m:GetItemResponseMessage>

En este ejemplo, EWS proporciona indicios para depurar el problema. Cuando el atributo ResponseClass tiene un valor de Error, se incluyen los siguientes elementos adicionales en la respuesta cuando corresponda:

  • MessageText: describe el error.

  • ResponseCode: contiene el código de error, que se puede usar para buscar recursos de solución de solución de problemas adicionales.

  • MessageXml: identifica los elementos que provocaron el error.

  • DescriptiveLinkKey: sin usar.

Puede usar la información proporcionada en estos elementos para investigar el problema. En el ejemplo anterior, MessageText indica que la propiedad no es válida para el tipo de objeto. La solicitud era para obtener un mensaje de correo electrónico, pero el conjunto de propiedades incluía el AssociatedCalendarItemId, que solo es válido para los elementos de cita.

En el ejemplo siguiente se muestra un error que se recibió como parte de una operación por lotes para obtener varios elementos de correo electrónico. El primer elemento se recuperó correctamente y ResponseClass se estableció en Success. No se pudo encontrar el segundo elemento y ResponseClass se establece en Error.

<m:GetItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                        xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
  <m:ResponseMessages>
    <m:GetItemResponseMessage ResponseClass="Success">
      <m:ResponseCode>NoError</m:ResponseCode>
      <m:Items>
        <t:Message>
          <t:ItemId Id="Er5cAAA="
                    ChangeKey="CQAAABYAAAD32nSTjepyT63rYH17n9THAAAhE0/O" />
          <t:Subject>Business plans</t:Subject>
        </t:Message>
      </m:Items>
    </m:GetItemResponseMessage>
    <m:GetItemResponseMessage ResponseClass="Error">
      <m:MessageText>The specified object was not found in the store.</m:MessageText>
      <m:ResponseCode>ErrorItemNotFound</m:ResponseCode>
      <m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>
      <m:Items />
    </m:GetItemResponseMessage>
  </m:ResponseMessages>
</m:GetItemResponse>

Cuando uno o varios elementos de una solicitud por lotes no se pueden procesar como se solicita, se devuelve un error para cada elemento que produjo un error y el resto de los elementos del lote se procesan según lo esperado. Los errores en el procesamiento por lotes pueden producirse si el elemento se eliminó y, por lo tanto, no se puede enviar, recuperar o actualizar, o si el elemento se movió a una carpeta diferente y, por lo tanto, tiene un nuevo identificador de elemento. Dado que la operación se completará para algunos elementos y no devolverá un error cuando uno o varios elementos no se puedan procesar, es importante comprobar cada atributo ResponseClass antes de pasar a la siguiente operación.

Si la información proporcionada por los elementos de respuesta no le ayuda a corregir la solicitud o desbloquearla, consulte Pasos siguientes.

Comprobar los resultados de una llamada de método de API administrada EWS

Si usa la API administrada EWS y llama a un método en un objeto ExchangeService, es probable que el método devuelva un objeto ServiceResponseCollection, que contiene una colección de objetos ServiceResponse o una colección de objetos derivados de los objetos ServiceResponse. El ServiceResponseCollection y los objetos ServiceResponse incluidos contienen información sobre el resultado de la llamada de método, que puede usar para comprobar los resultados.

Si usa la API administrada EWS y llama a un método en un obeto objeto Item o uno de los objetos derivados, es probable que el método no devuelva un objeto de respuesta para comprobar si se ha realizado correctamente, pero genera una Exception si el método no se completa correctamente.

Comprobar el éxito

Una ventaja de usar la API administrada EWS es que proporciona un estado general al tratar con varios elementos en una respuesta. Por lo tanto, si el método al que llamó devuelve una ServiceResponseCollection, puede comprobar que la propiedad OverallResult del ServiceResponseCollection es igual a ServiceResult.Success. Si es así, todos los elementos del proceso por lotes se completaron correctamente; no tiene que comprobar cada objeto ServiceResponse individualmente. Si la propiedad OverallResult no está establecida en ServiceResult.Success, debe controlar el error o la advertencia.

Si el método al que llama no devuelve ServiceResponseCollection, pero devuelve un objeto ServiceResponse, debe comprobar el valor de la propiedad Result. Si el valor Result se establece en Success, sabrá que el método se completó correctamente.

Si el método al que llama no tiene ningún valor devuelto, realmente no hay ninguna forma de comprobar si se ha hecho correctamente a través de la API administrada EWS. Siempre que no se produce una excepción, puede asumir que el método se completó correctamente. Para una validación adicional, también puede comprobar la respuesta SOAP para comprobar los resultados.

Administrar errores, advertencias y excepciones

Si el código de API administrada EWS produce una Exception, puede usar el valor Exception.Message para determinar el origen del error. La propiedad Message contiene el contenido del elemento MessageText en la respuesta SOAP subyacente. Además, si la excepción es de tipo objeto ServiceResponseException, una de las excepciones más comunes, también puede recuperar el ErrorCode contenido en el elemento SOAP ResponseCode subyacente y la propiedad Response que identifica el objeto ServiceResponse asociado. El código siguiente muestra cómo capturar y mostrar el contenido de una ServiceResponseException.

try
    {
         …
    }
    catch (ServiceResponseException ex)
    {
        Console.WriteLine("Error code: " + ex.ErrorCode);
        Console.WriteLine("Error message: " + ex.Message);
        Console.WriteLine("Response: " + ex.Response);
    }

Si el método al que llamó devuelve un ServiceResponseCollection y el valor de la propiedad OverallResult es igual a Warning o Error, tendrá que recorrer cada objeto de la ServiceResponseCollection para encontrar el error. La propiedad OverallResult se establece en Warning si al menos una respuesta tiene su valor Result establecido en Warning y todas las demás respuestas tienen sus valores Result establecidos en Success. La propiedad OverallResult se establece en Error si al menos una respuesta tiene su valor Result establecido en Error. Cuando el OverallResult se establece en Warning o Error, las siguientes propiedades se establecen en los objetos ServiceResponse según corresponda:

  • ErrorCode: contiene el código de error, que se puede usar para buscar los recursos de solución de problemas adicionales.

  • ErrorDetails: contiene los detalles sobre el error de algunos ErrorCodes. Por ejemplo, cuando el código de error es ErrorRecurrenceHasNoOccurrence, el ErrorDetails contendrá las claves para EffectiveStartDate y EffectiveEndDate.

  • ErrorMessage: describe el error.

  • ErrorProperties: si está disponible, identifica las propiedades que provocaron el error. Por ejemplo, cuando el código de error es ErrorInvalidPropertyForOperation, ErrorProperties contiene la definición de la propiedad que no era válida para la solicitud.

  • Result: contiene Error o Warning cuando se encuentra un problema.

Si la información proporcionada por las propiedades ServiceResponse no proporciona suficiente información para corregir la llamada de método o desbloquearlo, consulte Pasos siguientes para obtener más información sobre los valores ErrorCode.

Puede buscar información adicional de solución de problemas en los siguientes temas:

Además, en función de lo que intente realizar en su solicitud, puede encontrar información útil adicional sobre el código de error en los siguientes temas:

Vea también