Dela via


SOAP-baserat API returnerar 404- och 500 HTTP-statuskoder

Med hjälp av artikeln om felsökningsserien för Azure API Management är det här det andra scenariot i labbet. Se till att du har följt instruktionerna för labbkonfigurationen enligt detta för att återskapa problemet.

Ursprunglig produktversion: API Management Service
Ursprungligt KB-nummer: 4464934

Symptom

Kalkylator-API:et kan utföra fyra åtgärder – Lägg till, subtrahera, multiplicera och dividera baserat på två indataparametrar intA och intB. Namnet på åtgärderna är självförklarande för vilken funktion de utför. Det är en ASMX-tjänst (http://www.dneonline.com/calculator.asmx) som följer SOAP 1.1-protokollet så att indataparametrarna skickas i avsnittet med tvålkuvertets brödtext. Åtgärderna Lägg till och Subtrahera fungerar som förväntat, men du stöter på HTTP 404 när du anropar åtgärden Multiplicera och HTTP 500 medan du anropar divideringsåtgärden.

Förväntade utdata för åtgärden Multiplicera bör se ut ungefär så här:

<?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>

Förväntade utdata från dividera-åtgärden bör se ut ungefär så här:

<?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>

Felsökningsanvisningar

Du måste förstå vem som genererar dessa HTTP 404- och 500-svar, APIM eller SOAP-API:et för serverdelen. Det bästa sättet att få det svaret är att samla in APIM-kontrollspårning för att inspektera begäran och svar.

  • Multiplikationsåtgärden som genererar statuskoden HTTP – 404 (hittades inte) anger att ursprungsservern inte hittade någon aktuell representation för målresursen eller inte är villig att avslöja att den finns.

  • Om du undersöker serverdelsavsnittet i APIM-kontrollspårningen visas samma observation även från meddelandet:

    {
      "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."
          }
        }
      ]
    }
    
  • Därför bör du först undersöka url:en för begäran och rubrikerna som skickas från APIM till serverdels-API:et från fliken Test och jämföra den med exemplet på SOAP-begäran för åtgärden Multiplicera – http://www.dneonline.com/calculator.asmx.

    Begärandehuvuden från APIM-kontrollspårningen ser ut ungefär så här:

    {
      "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"
            }
          ]
        }
      }
    }
    
  • Enligt ASMX-tjänstdefinitionen för serverdelen skulle du märka att SOAP 1.1-begäran behöver ett begärandehuvud **SOAPAction som saknas i begäran som skickas från APIM.

    Host: www.dneonline.com
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/Multiply"
    
  • Att lägga till SOAPAction-huvudet med värdet http://tempuri.org/Multiply löser problemet. Du kan lägga till begärandehuvudet under klientdelsdefinitionen för åtgärden Multiplicera och ange värdet som standardvärde under fliken Rubriker så att du inte behöver skicka rubriken varje gång på varje begäran.

    Skärmbild av fliken Rubriker, där SOAPAction-huvudet med värdet läggs till.

  • Delningsåtgärden som genererar STATUSKOD FÖR HTTP 500 (internt serverfel) anger att servern påträffade ett oväntat villkor som hindrade den från att uppfylla begäran.

  • Serverdelstjänsten kan med andra ord inte bearbeta begärandetexten som skickas från APIM. Du kan undersöka begärandetexten som skickas från APIM.

  • När du kontrollerar SOAP-brödtexten ser du att nämnaren (intB) har angetts som noll, vilket leder till ett ohanterat undantag, vilket orsakar HTTP 500 (internt serverfel).

    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>
    
  • Om du kontrollerar innehållsrepresentationen för begäran från fliken Begäran som finns i klientdelsdefinitionen för åtgärden Dividera ser du att intB-värdet är inställt på noll. Du måste ändra värdet för intB till ett värde som inte är noll och det bör lösa problemet.

    Skärmbild av intB-värdet som är inställt på noll.

Kontakta oss för att få hjälp

Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.