共用方式為


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 作業的前端定義下新增要求標頭,並將值設定為 [標頭] 索引標籤下的預設標頭,如此一來,就不需要在每次要求上傳送該標頭。

    [標頭] 索引標籤的螢幕快照,其中已新增具有值的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>
    
  • 如果您從 Divide 作業前端定義中出現的 [要求] 索引標籤檢查要求內容表示法,您會注意到 intB 值設定為零。 您必須將intB的值變更為非零值,且應該解決此問題。

    設定為零之 intB 值的螢幕快照。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。