Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
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.