SOAP 型 API 會傳回 404 和 500 HTTP 狀態代碼
請參閱 Azure API 管理 疑難解答系列文章,這是實驗室的第二個案例。 請確定您已依照此指示遵循實驗室設定指示,以重新建立問題。
原始產品版本:API 管理 服務
原始 KB 編號: 4464934
徵兆
計算機 API 可以執行四個作業 - 根據兩個輸入參數 intA 和 intB 新增、減去、乘法和除法。 作業的名稱是其執行之函式的自我解釋。 它是 ASMX 服務 (http://www.dneonline.com/calculator.asmx) 遵循 SOAP 1.1 通訊協定,因此輸入參數會傳入 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(找不到)狀態代碼的乘法運算表示源伺服器找不到目標資源的目前表示法,或不願意透露存在。
如果您檢查 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 要求需要要求標頭 **SOAPAction,該標頭在從 APIM 傳送的要求中遺漏。
Host: www.dneonline.com Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/Multiply"
使用值http://tempuri.org/Multiply新增SOAPAction標頭將解決問題。 您可以在 Multiply 作業的前端定義下新增要求標頭,並將值設定為 [標頭] 索引標籤下的預設標頭,如此一來,就不需要在每次要求上傳送該標頭。
擲回 HTTP 500(內部伺服器錯誤)狀態代碼的分割作業表示伺服器遇到無法滿足要求的非預期狀況。
換句話說,後端服務無法處理從APIM傳送的要求本文。 您可以檢查從 APIM 傳送的要求本文。
檢查 SOAP 主體時,您會發現分母 (intB) 設定為零,導致未處理的例外狀況,因此導致 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 作業前端定義中出現的 [要求] 索引標籤檢查要求內容表示法,您會注意到 intB 值設定為零。 您必須將intB的值變更為非零值,且應該解決此問題。
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。