Freigeben über


SOAP-basierte API gibt 404- und 500-HTTP-status-Codes zurück

Im Artikel zur Azure API Management-Problembehandlungsreihe ist dies das zweite Szenario des Labs. Stellen Sie sicher, dass Sie die Anweisungen zum Einrichten des Labs wie folgt befolgt haben, um das Problem neu zu erstellen.

Ursprüngliche Produktversion: API Management Service
Ursprüngliche KB-Nummer: 4464934

Problembeschreibung

Die Rechner-API kann vier Vorgänge ausführen: Hinzufügen, Subtrahieren, Multiplizieren und Dividieren basierend auf den beiden Eingabeparametern intA und intB. Der Name der Vorgänge ist selbsterklärend, welche Funktion sie ausführen. Es handelt sich um einen ASMX-Dienst (http://www.dneonline.com/calculator.asmx), der dem SOAP 1.1-Protokoll folgt, sodass die Eingabeparameter im Textabschnitt des Soap-Umschlags übergeben werden. Add- und Subtrahieren-Vorgänge funktionieren wie erwartet, aber sie treten beim Aufrufen des Multiplikationsvorgangs auf HTTP 404 und HTTP 500 beim Aufrufen des Dividierungsvorgangs auf.

Die erwartete Ausgabe des Multiplikationsvorgangs sollte in etwa wie folgt aussehen:

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

Die erwartete Ausgabe des Divisionsvorgangs sollte in etwa wie folgt aussehen:

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

Schritte zur Problembehandlung

Sie müssen wissen, wer diese HTTP 404- und 500-Antworten, APIM oder die Back-End-SOAP-API auslöst. Die beste Möglichkeit, diese Antwort zu erhalten, besteht darin, die APIM-Inspektor-Ablaufverfolgung zu sammeln, um Anforderung und Antwort zu überprüfen.

  • Multiplikationsvorgang, der HTTP - 404 (nicht gefunden) status Code auslöst, gibt an, dass der Ursprungsserver keine aktuelle Darstellung für die Zielressource gefunden hat oder nicht bereit ist, offenzulegen, dass eine vorhanden ist.

  • Wenn Sie den Back-End-Abschnitt der APIM-Inspektor-Ablaufverfolgung untersuchen, wird die gleiche Beobachtung auch aus der Meldung ersichtlich:

    {
      "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."
          }
        }
      ]
    }
    
  • Daher sollten Sie zunächst die Anforderungs-URL und die Header untersuchen, die von APIM auf der Registerkarte Test an die Back-End-API gesendet werden, und sie mit dem Beispiel der SOAP-Anforderung für den Multiplikationsvorgang - http://www.dneonline.com/calculator.asmxvergleichen.

    Anforderungsheader aus der APIM-Inspektor-Ablaufverfolgung sehen in etwa wie folgt aus:

    {
      "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"
            }
          ]
        }
      }
    }
    
  • Gemäß der Back-End-ASMX-Dienstdefinition würden Sie feststellen, dass die SOAP 1.1-Anforderung einen Anforderungsheader **SOAPAction benötigt, der in der von APIM gesendeten Anforderung fehlt.

    Host: www.dneonline.com
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/Multiply"
    
  • Durch Hinzufügen des SOAPAction-Headers mit dem Wert http://tempuri.org/Multiply wird das Problem behoben. Sie können den Anforderungsheader unter der Front-End-Definition des Multiplikationsvorgangs hinzufügen und den Wert auf der Registerkarte Header als Standard festlegen, sodass Sie diesen Header nicht jedes Mal bei jeder Anforderung senden müssen.

    Screenshot der Registerkarte

  • Divisionsvorgang, der HTTP 500 (interner Serverfehler) status Code auslöst, gibt an, dass auf dem Server eine unerwartete Bedingung aufgetreten ist, die die Anforderung nicht erfüllen kann.

  • Anders ausgedrückt: Der Back-End-Dienst kann Ihren von APIM gesendeten Anforderungstext nicht verarbeiten. Sie können den von APIM gesendeten Anforderungstext untersuchen.

  • Beim Überprüfen des SOAP-Textkörpers würden Sie feststellen, dass der Nenner (intB) auf 0 festgelegt ist, was zu einer Ausnahme ohne Behandlung führt, wodurch HTTP 500 (interner Serverfehler) verursacht wird.

    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>
    
  • Wenn Sie die Darstellung des Anforderungsinhalts auf der Registerkarte Anforderung überprüfen, die in der Front-End-Definition des Division-Vorgangs vorhanden ist, werden Sie feststellen, dass der intB-Wert auf 0 (null) festgelegt ist. Sie müssen den Wert von intB in einen Wert ungleich 0 ändern, und das Problem sollte dadurch behoben werden.

    Screenshot des intB-Werts, der auf 0 (null) festgelegt ist

Kontaktieren Sie uns für Hilfe

Wenn Sie Fragen haben oder Hilfe mit Ihren Azure-Gutschriften benötigen, dann erstellen Sie beim Azure-Support eine Support-Anforderung oder fragen Sie den Azure Community-Support. Sie können auch Produktfeedback an die Azure Feedback Community senden.