次の方法で共有


EWS または EWS マネージ API の呼び出しの結果の確認

EWS または EWS マネージ API の呼び出しの結果を確認する方法について説明します。

プログラムが正しく実行されないとき、アプリケーションがネットワーク経由で送信している SOAP 要求とサーバーが送信している応答を調べることで、何が起こったか理解できます。 「EWS アプリケーションのトラブルシューティングに使用するツールとリソース」の記事では、それらの SOAP 要求をキャプチャして表示するためのツールへのリンクを掲載しています。 要求および応答を取得した後で、サーバーに送信した要求が正しく処理されたことを検証するには、どうしたらよいでしょうか。 続きを読んで確認してください。

EWS 要求を送信している場合は、応答の各応答メッセージの ResponseClass 属性を確認して、検証を開始します。 これにより、アイテムごとに操作が正常に完了したかどうかがわかります。

メソッドが呼び出しているオブジェクトに応じて、EWS 、マネージ API を使用して要求を送信する場合に、応答オブジェクトを使用していくつかの検証を行うことができます。 SOAP 応答には、EWS マネージ API の応答オブジェクトに含まれているもののスーパーセットが含まれているため、SOAP の応答も同様に確認することをお勧めします。 SOAP 応答には、EWS マネージ API の応答オブジェクトより多くの情報が含まれているため、SOAP 応答で、検証を開始します。

SOAP 応答の結果の確認

SOAP 応答を受信するとき、最初に ResponseClass 属性を確認します。 この属性は、次の例に示すように、ResponseMessages 要素の各 ResponseMessageType インスタンスに含まれています。

<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 応答には、1 つの 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 操作には SuccessResponseClass がありますが、基になる DelegateUserResponseMessageType 要素には Error の値の 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">
    <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>

このため、SOAP EWS の応答では、操作の ResponseClass を信頼できず、操作でアイテムの処理中にエラーが発生したかどうかを判断するには、各応答メッセージの ResponseClass を確認する必要があります。

成功を確認する

ResponseMessage 属性の ResponseClass 属性が Success に設定されている場合、すべてのアイテムで操作が正常に完了し、次のタスクに移動することができます。

次の例は、1 つのアイテムを取得するための GetItem 操作要求に対する正常な応答を示しています。 ResponseClassSuccess に設定されている場合、関連付けられた 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 要素には、SuccessResponseClass があります。

<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 に設定されている場合、1 つ以上のアイテムで操作が正常に完了していません。 問題を修正し、要求または失敗した要求の部分を再実行してください。 Warning の値の ResponseClass 属性の値は、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 がプロパティ セットに含まれています。

次の例は、複数の電子メール アイテムを取得するためのバッチ操作の一部として受信したエラーを示します。 最初のアイテムが正常に取得され、ResponseClassSuccess に設定されます。 2 番目のアイテムが見つからなかったため、ResponseClassError に設定されます。

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

バッチ要求の 1 つ以上のアイテムを要求どおりに処理できないと、失敗したアイテムごとにエラーが返されます。バッチ処理のそれ以外のアイテムは予期したとおりに処理されます。 対象アイテムが削除されたために送信、取得、更新できなかったり、対象アイテムが別のフォルダーに移動したためにアイテム ID が新しくなったりすると、バッチ処理でエラーが生じます。 操作がいくつかのアイテムでは完了した場合、1 つ以上のアイテムを処理できないときでもエラーが返されないため、次の操作に進む前に、それぞれの ResponseClass 属性を確認する必要があります。

応答要素によって提供される情報で、要求の修正またはブロックの解除ができない場合は、次の手順を参照してください。

EWS マネージ API メソッド呼び出しの結果の確認

EWS マネージ API を使用して ExchangeService オブジェクトにメソッドを呼び出している場合、メソッドは、ServiceResponse オブジェクトのコレクション、または ServiceResponse から派生したオブジェクトのコレクションを含む ServiceResponseCollection オブジェクトを返すはずです。 ServiceResponseCollection および含まれる ServiceResponse オブジェクトには、メソッドの呼び出しの結果に関する情報が含まれています。この情報を使って、結果を確認できます。

EWS マネージ API を使用して Item オブジェクトのメソッド、または派生オブジェクトの 1 つを呼び出している場合、メソッドは正常に完了したことを確認するための応答オブジェクトを返さず、メソッドが正常に完了しなかった場合に Exception をスローします。

成功を確認する

EWS マネージ API を使用する利点の 1 つは、1 つの応答で複数のアイテムを処理するとき、全体のステータスが提供されることです。 それで、呼び出したメソッドが ServiceResponseCollection を返した場合、ServiceResponseCollectionOverallResult のプロパティが ServiceResult.Success に等しいかどうかを確認できます。 等しい場合、バッチ プロセスのすべてのアイテムが正常に終了しています。ServiceResponse オブジェクトを個別に確認する必要はありません。 OverallResult プロパティが ServiceResult.Success に設定されていない場合、エラーまたは警告を処理する必要があります。

呼び出しているメソッドが ServiceResponseCollection を返さず、ServiceResponse オブジェクトを返す場合は、Result プロパティの値を確認する必要があります。 Result 値が Success に設定されている場合、メソッドが正常に完了したことがわかります。

呼び出しているメソッドに戻り値がない場合、EWS マネージ API によって成功を確認する方法は実際にはありません。 例外がスローされない限り、メソッドが正常に完了したと想定できます。 追加の検証をする場合は、SOAP 応答を確認して結果を確認することもできます。

エラー、警告、および例外の処理

EWS マネージ API のコードが Exception をスローした場合、Exception.Message の値を使用して、エラーの原因を特定できます。 Message プロパティには、基になる SOAP 応答内の MessageText 要素の内容が含まれます。 さらに、例外が最も一般的な例外の ServiceResponseException オブジェクト型である場合、基になる SOAP ResponseCode 要素に含まれる ErrorCode、および関連付けられた ServiceResponse オブジェクトを識別する Response プロパティも取得できます。 次のコードは、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 の各オブジェクト内をループして、エラーを検出します。 少なくとも 1 つの応答で Result の値が Warning に設定され、他のすべての応答で Result の値が Success に設定されている場合は、OverallResult プロパティは Warning に設定されます。 少なくとも 1 つの応答で Result の値が Error に設定されている場合は、OverallResult プロパティは Error に設定されます。 OverallResultWarning または Error に設定されている場合、以下のプロパティが ServiceResponse オブジェクトに適宜設定されます。

  • ErrorCode — 追加のトラブルシューティング リソースの検索に使用できるエラー コードが含まれています。

  • ErrorDetails — いくつかの ErrorCodes のエラーに関する詳細が含まれています。 たとえば、エラー コードが ErrorRecurrenceHasNoOccurrence の場合、ErrorDetails には EffectiveStartDateEffectiveEndDate のキーが含まれます。

  • ErrorMessage — エラーを説明します。

  • ErrorProperties — 可能な場合は、エラーの原因となったプロパティを識別します。 たとえば、エラー コードが ErrorInvalidPropertyForOperation の場合、ErrorProperties には要求に無効なプロパティの定義が含まれます。

  • Result — 問題が発生したときに Error または Warning が含まれます。

ServiceResponse プロパティによって提供される情報が、メソッドの呼び出しの修正、またはブロックの解除を行うための十分な情報を提供していない場合は、「次の手順」で ErrorCode の値の詳細な情報を確認してください。

次のトピックで、トラブルシューティングに関する追加の情報を検索できます。

さらに、要求で実現したい内容によっては、次のトピックでエラー コードに関するその他の有用な情報を見つけることができます。

関連項目