まとめ
この記事では、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 は、intAとintBの 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定義の下に要求ヘッダーを追加し、[ヘッダー] タブで既定値として値を設定します。要求ごとにそのヘッダー値を送信する必要がなくなりました。
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 以外の値に変更します。 この変更により、問題が解決されます。