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