Поделиться через


Проверка результатов вызова EWS или управляемого API EWS

Узнайте, как проверить результаты вызовов EWS или управляемого API EWS.

Если что-то работает неправильно, разобраться в ситуации помогает изучение запросов SOAP, которые ваше приложение отправляет по сети, и откликов, отправляемых обратно сервером. Статья Средства и ресурсы для устранения неполадок с приложениями EWS содержит ссылки на средства, которые помогают фиксировать и просматривать запросы SOAP. После получения запросов и откликов, как проверить правильность обработки отправленного на сервер запроса? Чтобы узнать это, продолжайте чтение.

Если вы отправляете запросы EWS, ваша проверка начнется с проверки атрибута ResponseClass для каждого ответного сообщения в отклике. Так вы узнаете, успешно ли выполнена операция с каждым элементом.

В зависимости от объекта, вызываемого вашим методом, если для отправки запросов используется управляемый API EWS, вы можете выполнить некоторую проверку с помощью объектов отклика. Но так как отклик SOAP содержит супермножество того, что добавляется в объекты отклика управляемого API EWS, вы также можете посмотреть на отклик SOAP. Так как отклик SOAP часто может содержать больше сведений, чем объекты отклика управляемого API EWS, начните свою проверку с отклика SOAP.

Проверка результатов отклика SOAP

Когда вы получаете отклик SOAP, первым делом следует посмотреть на атрибут ResponseClass. Этот атрибут входит в каждый экземпляр ResponseMessageType в элементе ResponseMessages, как показано в следующем примере.

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

Так как отклик SOAP может содержать несколько ответных сообщений в одном отклике SOAP, важно проверить каждое ответное сообщение по отдельности.

Если вы работаете с операцией, содержащей ResponseClass в составе отклика операции (как показано ниже), у вас может возникнуть соблазн проверить только атрибут ResponseClass операции.

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

Однако состояние операции отражает только форму отклика верхнего уровня и не отражает состояние всех отдельных откликов сообщений. В следующем примере операция AddDelegateResponse содержит ResponseClass со значением Success, но базовый элемент DelegateUserResponseMessageType содержит ResponseClass со значением Error.

<soap:Body>
  <m:AddDelegateResponse xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
                         ResponseClass="Success"
                         xmlns:m="http://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>

Поэтому в случае откликов EWS SOAP вы не можете полагаться на ResponseClass операции. Следует просматривать ResponseClass каждого сообщения отклика, чтобы определить, столкнулась ли операция с ошибками при обработке элементов.

Проверка успеха

Если каждому атрибуту ResponseClass каждого атрибута ResponseMessage присвоено значение Success, операция успешно выполнена для всех элементов, и вы можете перейти к следующей задаче.

В следующем примере показан успешный отклик на запрос операции GetItem для получения одного элемента. Обратите внимание, что если атрибуту ResponseClass присвоено значение Success, связанному атрибуту ResponseCode всегда присваивается значение NoError.

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="http://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>

Ниже показан успешный отклик на запрос операции GetItem для получения нескольких элементов. Каждый из элементов GetItemResponseMessage содержит ResponseClass со значением Success.

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
                     xmlns:t="http://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>

Обработка ошибок и предупреждений

Когда вы получаете отклик, а атрибуту ResponseClass присвоено значение Error, операция не выполнена успешно для одного или нескольких элементов. Исправьте проблему и повторите запрос или часть запроса со сбоем. Атрибут ResponseClass со значением Warning возвращается только операцией ResolveNames и указывает, что объект не удалось сопоставить с уникальным удостоверением. Вы можете игнорировать его для всех остальных операций.

В следующем отклике атрибут ResponseClass имеет значение 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>

В этом примере EWS предоставляет подсказки для отладки проблемы. Если атрибут ResponseClass имеет значение Error, в отклик включаются следующие дополнительные элементы, если это применимо.

  • MessageText — описывает ошибку.

  • ResponseCode — содержит код ошибки, который можно использовать для поиска дополнительных ресурсов по устранению неполадок.

  • MessageXml — определяет элементы, вызвавшие ошибку.

  • DescriptiveLinkKey — не используется.

Сведения, указанные в этих элементах, можно использовать для исследования проблемы. В предыдущем примере MessageText указывает, что свойство недопустимо для типа объекта. Запрос заключался в получении сообщения электронной почты, но установленное свойство включало атрибут AssociatedCalendarItemId, который действителен только для элементов встречи.

В следующем примере показана ошибка, полученная в рамках пакетной операции по получению нескольких элементов электронной почты. Первый элемент успешно извлечен, а атрибуту ResponseClass присвоено значение Success. Второй элемент не удалось найти, а атрибуту ResponseClass присвоено значение Error.

<m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
                        xmlns:t="http://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>

Если один или несколько элементов пакетного запроса невозможно обработать согласно запросу, для каждого элемента со сбоем возвращается ошибка, а остальные элементы в пакете обрабатываются ожидаемым образом. Сбои в пакетной обработке могут возникать, если элемент был удален и поэтому не может быть отправлен, извлечен или обновлен либо если элемент перемещен в другую папку и поэтому у него новый ИД элемента. Так как операция завершается для некоторых элементов без возвращения ошибки, когда один или несколько элементов невозможно обработать, важно проверить каждый атрибут ResponseClass перед переходом к следующей операции.

Если сведения, предоставленные элементами отклика, не помогут вам исправить запрос или разблокировать вашу работу, см. дальнейшие действия.

Проверка результатов вызова метода EWS или управляемого API EWS

Если вы используете управляемый API EWS и вызываете метод для объекта ExchangeService, ваш метод, скорее всего, вернет объект ServiceResponseCollection, содержащий коллекцию объектов ServiceResponse или коллекцию объектов, производных от объектов ServiceResponse. ServiceResponseCollection и включенные объекты ServiceResponse содержат сведения о результате вызова метода, которые можно использовать для проверки ваших результатов.

Если вы используете управляемый API EWS и вызываете метод для объекта Item или одного из производных объектов, этот метод, скорее всего, не вернет объект отклика для проверки на успешность, но вызовет Exception, если метод не завершен успешно.

Проверка успеха

Одним из преимуществ использования управляемого API EWS является то, что он предоставляет общее состояние при работе с несколькими элементами в одном отклике. Поэтому если метод, который вы назвали, возвращает ServiceResponseCollection, вы можете проверить, что свойство OverallResult объекта ServiceResponseCollection имеет значение ServiceResult.Success. Если это так, все элементы в пакетной обработке были успешно завершены. Вам не нужно проверять каждый объект ServiceResponse отдельно. Если свойству OverallResult не присвоено значение ServiceResult.Success, необходимо обработать ошибку или предупреждение.

Если вызываемый вами метод не возвращает ServiceResponseCollection, но возвращает объект ServiceResponse, необходимо проверить значение свойства Result. Если свойству Result присвоено значение Success, значит метод выполнен успешно.

Если вызываемый вами метод не содержит возвращаемого значения, не существует способа проверить успешность с помощью управляемого API EWS. До тех пор, пока не будет вызвано исключение, можно предполагать, что метод выполнен успешно. Для дополнительной проверки вы можете также проверить отклик SOAP для проверки результатов.

Обработка ошибок, предупреждений и исключений

Если код управляемого API EWS вызывает Exception, для определения источника ошибки можно использовать значение Exception.Message. Свойство Message содержит контент элемента MessageText в базовом отклике SOAP. Кроме того, если типом исключения является объект ServiceResponseException (одно из наиболее распространенных исключений), вы также можете получить ErrorCode, содержащийся в базовом элементе ResponseCode SOAP, и свойство Response, идентифицирующее связанный объект ServiceResponse. В следующем коде показано, как зафиксировать и отобразить содержимое ServiceResponseException.

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

Если вызываемый вами метод возвращает ServiceResponseCollection, а свойству OverallResult присвоено значение Warning или Error, для поиска ошибки необходимо просмотреть каждый объект в ServiceResponseCollection. Свойству OverallResult присваивается значение Warning, если по крайней мере в одном отклике свойству Result присвоено значение Warning, а во всех остальных откликах свойствам Result присвоено значение Success. Свойству OverallResult присваивается значение Error, если по крайней мере в одном отклике свойству Result присвоено значение Error. Если свойству OverallResult присвоено значение Warning или Error, для объектов ServiceResponse настраиваются следующие свойства соответствующим образом.

  • ErrorCode — содержит код ошибки, который можно использовать для поиска дополнительных ресурсов по устранению неполадок.

  • ErrorDetails — содержит сведения об ошибке для некоторых объектов ErrorCode. Например, если кодом ошибки является ErrorRecurrenceHasNoOccurrence, ErrorDetails будет содержать ключи для EffectiveStartDate и EffectiveEndDate.

  • ErrorMessage — описывает ошибку.

  • ErrorProperties — при наличии идентифицирует свойства, вызвавшие ошибку. Например, если кодом ошибки является ErrorInvalidPropertyForOperation, ErrorProperties содержит определение свойства, которое было недействительным для запроса.

  • Result — содержит значение Error или Warning при возникновении проблемы.

Если сведения, предоставленные свойствами ServiceResponse, содержат недостаточно сведений для исправления вызова вашего метода или разблокирования вашей работы, см. дальнейшие действия для поиска дополнительных сведений о значениях ErrorCode.

Дополнительные сведения об устранении неполадок см. в следующих темах.

Кроме того, в зависимости от целей вашего запроса, вы можете найти дополнительные сведения о коде ошибки в следующих темах.

См. также