基于 SOAP 的 API 返回 404 和 500 HTTP 状态代码

请参阅有关 Azure API 管理故障排除系列的文章,这是实验室的第二个方案。 请确保已按照实验室设置说明 进行操作,以重新创建问题。

原始产品版本:API 管理服务
原始 KB 编号: 4464934

症状

计算器 API 可以执行四个操作 - 基于两个输入参数 intAintB 进行。 操作的名称一目了然地了解它们所执行的功能。 它是一个 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 标头将解决此问题。 可以在乘法操作的 前端 定义下添加请求标头,并在“ 标头 ”选项卡下将该值设置为默认值,这样就不必每次在每个请求上都发送该标头。

    “标头”选项卡的屏幕截图,其中添加了带有 值的 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 的值更改为非零值,它应解决此问题。

    设置为零的 intB 值的屏幕截图。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。