原始 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>
除法运算的预期输出应如下所示:
<?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 请求需要从 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) 设置为零,导致未经处理的异常,从而导致 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">
<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 的值更改为非零值,它应解决此问题。