SOAP-API retourneert 404- en 500 HTTP-statuscodes
Dit is het tweede scenario van het lab in het artikel over het oplossen van problemen met Azure API Management. Zorg ervoor dat u de instructies voor het instellen van het lab hebt gevolgd om het probleem opnieuw te maken.
Oorspronkelijke productversie: API Management Service
Oorspronkelijk KB-nummer: 4464934
Symptomen
De Calculator-API kan vier bewerkingen uitvoeren: optellen, aftrekken, vermenigvuldigen en delen op basis van twee invoerparameters intA en intB. De naam van de bewerkingen is duidelijk voor welke functie ze uitvoeren. Het is een ASMX-service (http://www.dneonline.com/calculator.asmx) na het SOAP 1.1-protocol, zodat de invoerparameters worden doorgegeven in de hoofdtekst van de soap-envelop. Bewerkingen voor optellen en aftrekken werken prima zoals verwacht, maar u ondervindt HTTP 404 tijdens het aanroepen van de bewerking Vermenigvuldiging en HTTP 500 tijdens het aanroepen van de bewerking Delen.
De verwachte uitvoer van de vermenigvuldigingsbewerking moet er ongeveer als volgt uitzien:
<?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>
De verwachte uitvoer van de divide-bewerking moet er ongeveer als volgt uitzien:
<?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>
Stappen voor probleemoplossing
U moet weten wie deze HTTP 404- en 500-antwoorden, APIM of de BACK-end SOAP API genereert. De beste manier om dat antwoord te krijgen, is het verzamelen van APIM Inspector-tracering om de aanvraag en het antwoord te inspecteren.
Vermenigvuldigingsbewerking die de statuscode HTTP - 404 (Niet gevonden) genereert, geeft aan dat de oorspronkelijke server geen huidige weergave voor de doelresource heeft gevonden of niet bereid is om bekend te maken dat er een bestaat.
Als u de back-endsectie van de APIM-controletracering bekijkt, is dezelfde observatie ook duidelijk uit het bericht:
{ "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." } } ] }
Daarom moet u eerst de aanvraag-URL en headers onderzoeken die vanuit APIM naar de back-end-API worden verzonden vanaf het tabblad Testen en deze vergelijken met het voorbeeld van de SOAP-aanvraag voor de vermenigvuldigingsbewerking - http://www.dneonline.com/calculator.asmx.
Aanvraagheaders van APIM Inspector-tracering zien er ongeveer als volgt uit:
{ "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" } ] } } }
Volgens de definitie van de back-end ASMX-service ziet u dat soap 1.1-aanvraag een aanvraagheader **SOAPAction nodig heeft die ontbreekt in de aanvraag die is verzonden vanuit APIM.
Host: www.dneonline.com Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/Multiply"
Als u SOAPAction-header toevoegt met de waardehttp://tempuri.org/Multiply, wordt het probleem opgelost. U kunt de aanvraagheader toevoegen onder de front-enddefinitie van de vermenigvuldigingsbewerking en de waarde instellen als standaardwaarde onder het tabblad Kopteksten , zodat u deze header niet elke keer per aanvraag hoeft te verzenden.
Verdeelbewerking die de statuscode HTTP 500 (Interne serverfout) genereert, geeft aan dat de server een onverwachte voorwaarde heeft aangetroffen waardoor deze niet aan de aanvraag kan voldoen.
Met andere woorden, de back-endservice kan uw aanvraagbody die is verzonden vanuit APIM niet verwerken. U kunt de aanvraagbody onderzoeken die is verzonden vanuit APIM.
Bij het controleren van de SOAP-hoofdtekst ziet u dat de noemer (intB) is ingesteld als nul, wat leidt tot een niet-verwerkte uitzondering, waardoor HTTP 500 (interne serverfout) wordt veroorzaakt.
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>
Als u de weergave van de aanvraaginhoud controleert op het tabblad Aanvraag die aanwezig is in de Front-enddefinitie van de bewerking Delen, ziet u dat de intB-waarde is ingesteld op nul. U moet de waarde van intB wijzigen in een niet-nulwaarde en het probleem moet worden opgelost.
Contacteer ons voor hulp
Als u vragen hebt of hulp nodig hebt, maak een ondersteuningsaanvraag of vraag de Azure-communityondersteuning. U kunt ook productfeedback verzenden naar de Azure-feedbackcommunity.