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