添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
无邪的弓箭  ·  std::hash<std::basic_s ...·  1 月前    · 
乖乖的橡皮擦  ·  Research progress on ...·  6 月前    · 
自信的小狗  ·  Taskbar Icon ...·  10 月前    · 
原始 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 的值更改为非零值,它应解决此问题。

  •