L'API basata su SOAP restituisce codici di stato HTTP 404 e 500
Facendo riferimento all'articolo su Azure Gestione API Serie di risoluzione dei problemi, questo è il secondo scenario del lab. Assicurarsi di aver seguito le istruzioni di configurazione del lab in base a questa situazione, per ricreare il problema.
Versione originale del prodotto: servizio Gestione API
Numero KB originale: 4464934
Sintomi
L'API Calcolatrice può eseguire quattro operazioni: aggiungere, sottrarre, moltiplicare e dividere in base a due parametri di input intA e intB. Il nome delle operazioni è autoesplicativo della funzione eseguita. Si tratta di un servizio ASMX (http://www.dneonline.com/calculator.asmx) che segue il protocollo SOAP 1.1 in modo che i parametri di input vengano passati nella sezione corpo della busta soap. Le operazioni di aggiunta e sottrazione funzionano correttamente come previsto, ma si verifica HTTP 404 durante la chiamata dell'operazione Di moltiplicazione e HTTP 500 durante la chiamata dell'operazione di divisione.
L'output previsto dell'operazione Di moltiplicazione dovrebbe essere simile al seguente:
<?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>
L'output previsto dell'operazione di divisione dovrebbe essere simile al seguente:
<?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>
Passaggi per la risoluzione dei problemi
È necessario comprendere chi genera queste risposte HTTP 404 e 500 risposte, Gestione API o API SOAP back-end. Il modo migliore per ottenere tale risposta consiste nel raccogliere la traccia del controllo gestione API per controllare la richiesta e la risposta.
L'operazione di moltiplicazione che genera il codice di stato HTTP - 404 (Non trovato) indica che il server di origine non ha trovato una rappresentazione corrente per la risorsa di destinazione o non è disposto a divulgare che esiste.
Se si esamina la sezione back-end della traccia del controllo Gestione API, la stessa osservazione è evidente anche dal messaggio:
{ "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." } } ] }
È quindi necessario esaminare prima di tutto l'URL della richiesta e le intestazioni inviate da Gestione API all'API back-end dalla scheda Test e confrontarla con l'esempio di richiesta SOAP per l'operazione Multiply - http://www.dneonline.com/calculator.asmx.
Le intestazioni di richiesta dalla traccia del controllo Gestione API hanno un aspetto simile al seguente:
{ "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" } ] } } }
In base alla definizione del servizio ASMX back-end, si noterà che la richiesta SOAP 1.1 richiede un'intestazione di richiesta **SOAPAction mancante nella richiesta inviata da Gestione API.
Host: www.dneonline.com Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/Multiply"
L'aggiunta dell'intestazione SOAPAction con il valore http://tempuri.org/Multiply risolverà il problema. È possibile aggiungere l'intestazione della richiesta nella definizione front-end dell'operazione Di moltiplicazione e impostare il valore come predefinito nella scheda Intestazioni in modo che non sia necessario inviare tale intestazione ogni volta in ogni richiesta.
L'operazione di divisione che genera codice di stato HTTP 500 (errore interno del server) indica che il server ha rilevato una condizione imprevista che ha impedito di soddisfare la richiesta.
In altre parole, il servizio back-end non è in grado di elaborare il corpo della richiesta inviato da Gestione API. È possibile esaminare il corpo della richiesta inviato da Gestione API.
Quando si controlla il corpo SOAP, si noterà che il denominatore (intB) è impostato su zero, causando un'eccezione non gestita, causando quindi HTTP 500 (errore interno del server).
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>
Se si controlla la rappresentazione del contenuto della richiesta dalla scheda Richiesta presente nella definizione front-end dell'operazione di divisione, si noterà che il valore intB è impostato su zero. È necessario modificare il valore di intB in un valore diverso da zero e risolvere il problema.
Contattaci per ricevere assistenza
In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.