基于 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 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>
Divide 操作的预期输出应如下所示:
<?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 标头将解决问题。 可以在乘法操作的前端定义下添加请求标头,并将该值设置为“标头”选项卡下的默认标头,这样就不必每次在每个请求上发送该标头。
引发 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>
如果从“除法”操作前端定义中显示的“请求”选项卡中检查请求内容表示形式,你会注意到 intB 值设置为零。 需要将 intB 的值更改为非零值,并应解决此问题。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。