Udostępnij za pośrednictwem


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

Korzystając z artykułu z serii rozwiązywania problemów z usługą Azure API Management, jest to drugi scenariusz laboratorium. Upewnij się, że wykonano instrukcje konfiguracji laboratorium zgodnie z tym, aby ponownie utworzyć problem.

Oryginalna wersja produktu: usługa API Management
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 samo objaśniająca, jaką funkcję 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ść 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 mnożenia 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 Dzielenia 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>

Kroki rozwiązywania problemów

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

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

  • Jeśli zbadasz 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 wysyłane z usługi APIM do interfejsu API zaplecza z karty Test i porównać je z przykładem żądania PROTOKOŁU SOAP dla operacji mnożenia — 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 zauważysz, że żądanie PROTOKOŁU SOAP 1.1 wymaga nagłówka żądania **SOAPAction, którego 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ć w definicji frontonu operacji Pomnożenie 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żdym żądaniu.

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

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

  • Innymi słowy usługa zaplecza nie może przetworzyć treści żądania wysłanej z usługi APIM. Treść żądania wysłana z usługi APIM można sprawdzić.

  • Podczas sprawdzania treści protokołu SOAP zauważysz, że mianownik (intB) jest ustawiony jako zero, co prowadzi do nieobsługiwanego wyjątku, co powoduje błąd 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 znajdującej się w definicji frontonu operacji Dzielenie, zauważysz, że wartość intB jest ustawiona na zero. Należy zmienić wartość intB na wartość niezerową i rozwiązać ten 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 na temat platformy Azure.