SOAP ベースの API から 404 と 500 の HTTP 状態コードが返される
Azure API Management トラブルシューティング シリーズに関する記事を参照して、これはラボの 2 番目のシナリオです。 問題を再現するには、このに従ってラボのセットアップ手順に従っていることを確認します。
元の製品バージョン: API Management サービス
元の KB 番号: 4464934
現象
Calculator API は、2 つの入力パラメーター intA と intB に基づいて、Add、Subtract、Multiply、Divide の 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 とヘッダーを Test タブから確認し、乗算操作の 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"
SOAPAction値をhttp://tempuri.org/Multiplyヘッダーに追加すると、問題が解決します。 Multiply 操作の Frontend 定義の下に要求ヘッダーを追加し、 Headers タブの既定のヘッダーとして値を設定して、各要求で毎回そのヘッダーを送信する必要がないようにすることができます。
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>
Divide 操作の Frontend 定義にある Request タブから要求コンテンツ表現を確認すると、intB 値が 0 に設定されていることがわかります。 intBの値をゼロ以外の値に変更する必要があり、問題を解決する必要があります。
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。