SOAP ベースの API HTTP 404 および HTTP 500 エラーのトラブルシューティング

まとめ

この記事では、Azure API Managementで HTTP 404 エラーと HTTP 500 エラーを返す SOAP ベースの API のトラブルシューティング方法について説明します。

この記事は、Azure API Management トラブルシューティング シリーズ ラボの 2 番目のシナリオです。 API Management トラブルシューティング シリーズのラボ手順に従って、ラボのセットアップを行ってください。

元の製品バージョン: API Management サービス
元の KB 番号: 4464934

症状

http://www.dneonline.com/calculator.asmxで見つかった Calculator API は、intAintBの 2 つの入力パラメーターに基づいて、加算減算乗算除算の 4 つの操作を実行します。 この API は、単純オブジェクト アクセス プロトコル (SOAP) 1.1 プロトコルを使用する ASMX ファイル ベースのサービスを使用するため、入力パラメーターは SOAP エンベロープ本文で渡されます。

このシナリオでは、追加操作と減算操作は想定どおりに動作しますが、乗算操作の実行中に HTTP 404 エラーが発生し、除算操作の実行時に HTTP 500 エラーが発生します。

乗算演算の予想される出力は、次の例のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>
      <MultiplyResponse xmlns="http://tempuri.org/">
         <MultiplyResult>int</MultiplyResult>
      </MultiplyResponse>
   </soap:Body>
</soap:Envelope>

除算操作の予想される出力は、次の例のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>
      <DivideResponse xmlns="http://tempuri.org/">
         <DivideResult>int</DivideResult>
      </DivideResponse>
   </soap:Body>
</soap:Envelope>

Troubleshooting

HTTP 404 応答と HTTP 500 応答 (API Management またはバックエンド SOAP API) の原因を特定するには、API Management インスペクター トレースを収集して要求と応答を検査します。

複数の操作によって HTTP 404 または HTTP 500 エラーが発生した場合、配信元サーバーがターゲット リソースの現在の表現を見つけられないか、存在することを開示できないことを示します。

API Management インスペクター トレースのバックエンド セクションを調べると、次の例に示すように、メッセージから同じ観察が明らかになります。

    {
      "backend": [
        {
          "source": "configuration",
          "timestamp": "2018-07-29T12:30:08.3500317Z",
          "elapsed": "00:00:00.7276962",
          "data": {
            "message": "Unable to identify Api or Operation for this request. Responding to the caller with 404 Resource Not Found."
          }
        }
      ]
    }

まず、テストから API Management からバックエンド API に送信された要求 URL とヘッダーを調べ、http://www.dneonline.com/calculator.asmxで実行した乗算操作の SOAP 要求のサンプルと比較する必要があります。

API Management インスペクター トレースからの要求ヘッダーは、次の例のようになります。

    {
      "data": {
        "request": {
          "method": "POST",
          "url": "https://pratyay.azure-api.net/calc",
          "headers": [
            {
              "name": "Ocp-Apim-Subscription-Key",
              "value": "34ae22db7f2c4c5da7b74a55adf03223"
            },
            {
              "name": "X-Forwarded-For",
              "value": "223.226.79.35"
            },
            {
              "name": "Cache-Control",
              "value": "no-cache"
            },
            {
              "name": "Connection",
              "value": "Keep-Alive"
            },
            {
              "name": "Content-Length",
              "value": "292"
            },
            {
              "name": "Content-Type",
              "value": "application/soap+xml; action=http://tempuri.org/Multiply"
            },
            {
              "name": "Accept",
              "value": "*/*"
            },
            {
              "name": "Accept-Encoding",
              "value": "gzip,deflate,br"
            },
            {
              "name": "Accept-Language",
              "value": "en-US,en;q=0.5"
            },
            {
              "name": "Host",
              "value": "pratyay.azure-api.net"
            },
            {
              "name": "Referer",
              "value": "https://apimanagement.hosting.portal.azure.net/apimanagement/Content/1.0.385.3/apimap/apimap-apis/index.html?locale=en&trustedAuthority=https://ms.portal.azure.com"
            }
          ]
        }
      }
    }

SOAP 1.1 要求には、次の例に示すように、API Management から送信された最初の要求に不足している要求ヘッダー SOAPAction が必要です。

    Host: www.dneonline.com
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/Multiply"

SOAPActionヘッダーを値http://tempuri.org/Multiply追加すると、問題が解決します。 乗算操作のFrontend定義の下に要求ヘッダーを追加し、[ヘッダー] タブで既定値として値を設定します。要求ごとにそのヘッダー値を送信する必要がなくなりました。

SOAPAction ヘッダーとその既定値を含む [乗算操作ヘッダー] タブのスクリーンショット。

HTTP 500 (内部サーバー エラー) エラーを引き起こす分割操作は、サーバーで予期しない状態が発生し、要求が満たされていないことを示します。 この条件は、バックエンド サービスが API Management から送信された要求本文を処理できないことを意味します。

API Management から送信された要求本文を確認できるようになりました。 分母 (intB) が 0 に設定され、ハンドルされない例外が発生します。 この状態は、 HTTP 500 (内部サーバー エラー) の原因です

次の例は、 分割 操作のために API Management インスペクター トレースから送信された要求本文を示しています。

    POST calc HTTP/1.1
    
    Host: pratyay.azure-api.net
    SOAPAction: http://tempuri.org/Divide
    Cache-Control: no-cache
    Ocp-Apim-Trace: true
    Content-Type: application/soap+xml; action=http://tempuri.org/Divide
    Ocp-Apim-Subscription-Key: ********************************
    
    <?xml version="1.0" encoding="utf-8"?>
    <Envelope xmlns="http://www.w3.org/2003/05/soap-envelope">
      <Body>
        <Divide xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
          <intA>1</intA>
          <intB>0</intB>
        </Divide>
      </Body>
    </Envelope>

除算操作のFrontend定義にある [要求] タブから要求コンテンツ表現を確認すると、intB 値が 0 に設定されていることがわかります。 intBの値を 0 以外の値に変更します。 この変更により、問題が解決されます。

intB 入力値が 0 に設定されている [除算操作要求] タブのスクリーンショット。