Udostępnij za pośrednictwem


Interfejs API oparty na protokole SOAP zwraca kody stanu HTTP 404 i 500

Odwołując się do artykułu dotyczącego serii rozwiązywania problemów z usługą Azure API Management, jest to drugi scenariusz laboratorium. Upewnij się, że zostały wykonane instrukcje konfiguracji laboratorium zgodnie z tym, aby ponownie utworzyć problem.

Oryginalna wersja produktu: API Management Service
Oryginalny numer KB: 4464934

Symptomy

Interfejs API kalkulatora może wykonywać cztery operacje — Dodawanie, Odejmowanie, Mnożenie i Dzielenie na podstawie dwóch parametrów wejściowych intA i intB. Nazwa operacji jest objaśniającą funkcją, jaką wykonują. Jest to usługa ASMX (http://www.dneonline.com/calculator.asmx) po protokole SOAP 1.1, więc parametry wejściowe są przekazywane w sekcji treści koperty mydła. Operacje dodawania i odejmowania działają prawidłowo zgodnie z oczekiwaniami, ale podczas wywoływania operacji Mnożenia i HTTP 500 podczas wywoływania operacji Dzielenia występuje błąd HTTP 404.

Oczekiwane dane wyjściowe operacji Multiply powinny wyglądać mniej więcej tak:

<?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 Divide powinny wyglądać mniej więcej tak:

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

Czynności umożliwiające rozwiązywanie problemów

Musisz zrozumieć, kto zgłasza te odpowiedzi HTTP 404 i 500, INTERFEJS APIM lub interfejs API SOAP zaplecza. Najlepszym sposobem uzyskania tej odpowiedzi jest zebranie śledzenia inspektora usługi APIM w celu sprawdzenia żądania i odpowiedzi.

  • Pomnożenie operacji zgłaszającego kod stanu HTTP — 404 (Nie znaleziono) wskazuje, że serwer pochodzenia nie znalazł bieżącej reprezentacji zasobu docelowego lub nie chce ujawnić, że istnieje.

  • Jeśli przeanalizujesz sekcję zaplecza śledzenia inspektora usługi APIM, ta sama obserwacja jest również widoczna w komunikacie:

    {
      "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."
          }
        }
      ]
    }
    
  • W związku z tym należy najpierw zbadać adres URL żądania i nagłówki wysłane z usługi APIM do interfejsu API zaplecza z karty Test i porównać je z przykładem żądania SOAP dla operacji Multiply — http://www.dneonline.com/calculator.asmx.

    Nagłówki żądań ze śledzenia inspektora usługi APIM wyglądają mniej więcej tak:

    {
      "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"
            }
          ]
        }
      }
    }
    
  • Zgodnie z definicją usługi ASMX zaplecza można zauważyć, że żądanie PROTOKOŁU SOAP 1.1 wymaga nagłówka żądania **SOAPAction, który brakuje w żądaniu wysłanym z usługi APIM.

    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ąże problem. Nagłówek żądania można dodać do definicji frontonu operacji Multiply i ustawić wartość jako domyślną na karcie Nagłówki , aby nie trzeba było wysyłać tego nagłówka za każdym razem na każde żądanie.

    Zrzut ekranu przedstawiający kartę Nagłówki, na której jest dodawany nagłówek SOAPAction z wartością.

  • Operacja dzielenia zgłasza kod stanu HTTP 500 (wewnętrzny błąd serwera) wskazuje, że serwer napotkał nieoczekiwany warunek, który uniemożliwił mu spełnienie żądania.

  • Innymi słowy, usługa zaplecza nie może przetworzyć treści żądania wysłanej z usługi APIM. Możesz sprawdzić treść żądania wysłaną z usługi APIM.

  • Po sprawdzeniu treści protokołu SOAP można zauważyć, że mianownik (intB) jest ustawiony na zero, co prowadzi do nieobsługiwanego wyjątku, co powoduje http 500 (wewnętrzny błąd serwera).

    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>
    
  • Jeśli sprawdzisz reprezentację zawartości żądania na karcie Żądanie w definicji frontonu operacji Divide, zauważysz, że wartość intB jest ustawiona na zero. Musisz zmienić wartość intB na wartość intB inną niż zero i powinna ona rozwiązać problem.

    Zrzut ekranu przedstawiający wartość intB ustawioną na zero.

Skontaktuj się z nami, aby uzyskać pomoc

Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii platformy Azure.