Rozwiązywanie problemów z błędami HTTP 404 i HTTP 500 w interfejsie API opartym na protokole SOAP

Podsumowanie

W tym artykule wyjaśniono, jak rozwiązywać problemy z interfejsem API opartym na protokole SOAP, który zwraca błędy HTTP 404 i HTTP 500 w Azure API Management.

Ten artykuł jest drugim scenariuszem laboratorium serii rozwiązywania problemów z Azure API Management. Upewnij się, że postępujesz zgodnie z instrukcjami konfiguracji laboratorium według instrukcji laboratorium z serii dotyczącej rozwiązywania problemów z usługą API Management.

Oryginalna wersja produktu: usługa API Management
Oryginalny numer KB: 4464934

Objawy

Interfejs API kalkulatora znaleziony w http://www.dneonline.com/calculator.asmx programie wykonuje cztery operacje: Dodawanie, Odejmowanie, Mnożenie i Dzielenie na podstawie dwóch parametrów wejściowych: intA i intB. Ten interfejs API używa usługi opartej na plikach ASMX, która używa protokołu Simple Object Access Protocol (SOAP) 1.1, więc parametry wejściowe są przekazywane w treści koperty protokołu SOAP.

W tym scenariuszu operacje Dodawania i odejmowania działają zgodnie z oczekiwaniami, ale występują błędy HTTP 404 podczas wykonywania operacji mnożenia i błędów HTTP 500 podczas wykonywania operacji dzielenia.

Oczekiwane dane wyjściowe operacji mnożenia powinny być podobne do następującego przykładu:

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

Oczekiwane dane wyjściowe operacji Dzielenia powinny być podobne do następującego przykładu:

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

Troubleshooting

Aby ustalić, co powoduje odpowiedzi HTTP 404 i HTTP 500 (czy odpowiada za to API Management, czy backendowy interfejs API SOAP), zbierz ślad inspektora API Management, aby przeanalizować żądanie i odpowiedź.

Jeśli wiele operacji powoduje błędy HTTP 404 lub HTTP 500 , oznacza to, że serwer pochodzenia nie może znaleźć bieżącej reprezentacji zasobu docelowego lub nie może ujawnić, że istnieje.

Gdy przeanalizujesz sekcję back-end w śladzie inspektora usługi API Management, tę samą obserwację można zauważyć w komunikacie, jak widać w poniższym przykładzie:

    {
      "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."
          }
        }
      ]
    }

Najpierw należy sprawdzić adres URL żądania i nagłówki wysyłane z usługi API Management do interfejsu API zaplecza z poziomu Test i porównać je z przykładowym żądaniem SOAP dla operacji Multiply, które wykonano w http://www.dneonline.com/calculator.asmx.

Nagłówki żądań ze śledzenia inspektora usługi API Management wyglądają podobnie do następującego przykładu:

    {
      "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"
            }
          ]
        }
      }
    }

Żądanie protokołu SOAP 1.1 wymaga nagłówka SOAPAction żądania, którego brakuje w początkowym żądaniu wysłanym z usługi API Management, jak pokazano w poniższym przykładzie:

    Host: www.dneonline.com
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/Multiply"

Dodanie nagłówka SOAPAction z wartością http://tempuri.org/Multiply rozwiązuje problem. Dodaj nagłówek żądania pod Frontend definicją operacji Mnożenie , a następnie ustaw wartość jako wartość domyślną na karcie Nagłówki . Nie musisz już wysyłać tej wartości nagłówka dla każdego żądania.

Zrzut ekranu przedstawiający kartę Nagłówki operacji Multiply z nagłówkiem SOAPAction i jego wartością domyślną.

Operacja dzielenia powodująca błędy HTTP 500 (wewnętrzny błąd serwera) wskazuje, że serwer napotkał nieoczekiwany warunek, który uniemożliwił spełnienie żądania. Ten warunek oznacza, że usługa zaplecza nie może przetworzyć treści żądania wysłanej z usługi API Management.

Teraz możesz sprawdzić treść żądania wysłaną z usługi API Management. Mianownik (intB) jest ustawiony na zero, co prowadzi do nieobsługiwanego wyjątku. Ten warunek jest przyczyną błędu HTTP 500 (wewnętrzny błąd serwera).

Poniższy przykład przedstawia treść żądania wysłaną w śledzeniu inspektora usługi API Management dla operacji Divide:

    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>

Po sprawdzeniu reprezentacji zawartości żądania na karcie Żądanie znajdującej się w Frontend definicji operacji Dzielenia widać, że wartość intB jest ustawiona na zero. Zmień wartość intB na wartość inną niż zero. Ta zmiana powinna rozwiązać problem.

Zrzut ekranu przedstawiający kartę Żądanie operacji Divide z wartością wejściową intB ustawioną na zero.