SOAP ベースの API は、404 と 500 の HTTP 状態コードを返しています
Azure API Management トラブルシューティング シリーズに関する記事を参照して、これはラボの 2 番目のシナリオです。 問題を再現するには、 この手順に従ってラボのセットアップ手順に従っていることを確認します。
元の製品バージョン: API Management サービス
元の KB 番号: 4464934
現象
Calculator API では、2 つの入力パラメーター intA と intB に基づいて、加算、減算、乗算、除算の 4 つの操作を実行できます。 操作の名前は、どの関数を実行するかについて説明します。 これは、SOAP 1.1 プロトコルに続く ASMX サービス (http://www.dneonline.com/calculator.asmx) であるため、入力パラメーターは soap エンベロープ本文セクションで渡されます。 加算操作と減算操作は期待どおりに正常に動作しますが、除算操作の呼び出し中に乗算操作と HTTP 500 の呼び出し中に HTTP 404 が発生しています。
乗算演算の予想される出力は、次のようになります。
<?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>
トラブルシューティングの手順
これらの HTTP 404 および 500 応答、APIM、またはバックエンド SOAP API をスローしているユーザーを理解する必要があります。 その回答を取得する最善の方法は、 APIM インスペクター トレース を収集して要求と応答を検査することです。
HTTP - 404 (Not Found) 状態コードをスローする乗算操作は、配信元サーバーがターゲット リソースの現在の表現を見つけられなかったか、存在することを開示する意思がないことを示します。
APIM インスペクター トレースのバックエンド セクションを調べると、メッセージからも同じ観察が明らかになります。
{ "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." } } ] }
そのため、最初に APIM からバックエンド API に送信される要求 URL とヘッダーを [テスト] タブから調べ、乗算操作の SOAP 要求のサンプルと比較する必要があります。 http://www.dneonline.com/calculator.asmx
APIM インスペクター トレースからの要求ヘッダーは、次のようになります。
{ "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" } ] } } }
バックエンド ASMX サービス定義に従って、SOAP 1.1 要求には、APIM から送信された要求に存在しない要求ヘッダー **SOAPAction が必要であることがわかります。
Host: www.dneonline.com Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/Multiply"
値http://tempuri.org/Multiplyを含む SOAPAction ヘッダーを追加すると、問題が解決されます。 乗算操作の フロントエンド 定義の下に要求ヘッダーを追加し、[ ヘッダー ] タブの既定のヘッダーとして値を設定して、要求ごとにそのヘッダーを送信する必要がないようにすることができます。
HTTP 500 をスローする分割操作 (内部サーバー エラー) 状態コードは、サーバーが予期しない条件を検出し、要求を満たすことができなかったことを示します。
つまり、バックエンド サービスは APIM から送信された要求本文を処理できません。 APIM から送信された要求本文を調べることができます。
SOAP 本文を確認すると、分母 (intB) が 0 に設定され、ハンドルされない例外が発生するため、HTTP 500 (内部サーバー エラー) が発生します。
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>
分割操作のフロントエンド定義にある [要求] タブから要求コンテンツ表現をチェックすると、intB 値が 0 に設定されていることがわかります。 intB の値を 0 以外の値に変更する必要があり、問題を解決する必要があります。
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。