Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Sommario
Questo articolo illustra come risolvere i problemi relativi a un'API basata su SOAP che restituisce errori HTTP 404 e HTTP 500 in Gestione API di Azure.
Questo articolo descrive il secondo scenario del laboratorio della serie sulla risoluzione dei problemi di Gestione API di Azure. Assicurarsi di seguire le istruzioni di configurazione del lab in base alle istruzioni del lab della serie di risoluzione dei problemi di Gestione API.
Versione originale del prodotto: servizio Gestione API
Numero KB originale: 4464934
Sintomi
L'API Calcolatrice trovata in http://www.dneonline.com/calculator.asmx esegue quattro operazioni: Add, Subtract, Multiply e Divide, in base a due parametri di input: intA e intB. Questa API usa un servizio basato su file ASMX che usa il protocollo SOAP (Simple Object Access Protocol) 1.1 in modo che i parametri di input vengano passati nel corpo della busta SOAP.
In questo scenario, le operazioni Add and Subtract funzionano come previsto, ma si verificano errori HTTP 404 durante l'esecuzione di un'operazione Di moltiplicazione e errori HTTP 500 durante l'esecuzione di un'operazione di divisione .
L'output previsto di un'operazione Di moltiplicazione dovrebbe essere simile all'esempio 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 di un'operazione di divisione deve essere simile all'esempio 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>
Risoluzione dei problemi
Per determinare la causa delle risposte HTTP 404 e HTTP 500 (che siano dovute ad API Management o all'API SOAP back-end), raccogliere una traccia dell'ispettore di API Management per esaminare la richiesta e la risposta.
Se più operazioni causano errori HTTP 404 o HTTP 500 , indica che il server di origine non riesce a trovare una rappresentazione corrente per la risorsa di destinazione o non è in grado di rivelare che esiste.
Quando si esamina la sezione backend di una trace dell'inspector di API Management, la stessa osservazione si evince dallo stesso messaggio, come mostrato nell'esempio seguente:
{
"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."
}
}
]
}
È prima necessario esaminare l'URL della richiesta e le intestazioni inviate da Gestione API all'API back-end da Test e confrontarle con un esempio di richiesta SOAP per l'operazione Di moltiplicazione eseguita in http://www.dneonline.com/calculator.asmx.
Le intestazioni di richiesta in una traccia dell'Inspector di API Management sono simili al seguente esempio:
{
"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"
}
]
}
}
}
La richiesta SOAP 1.1 richiede un'intestazione di richiesta mancante SOAPAction nella richiesta iniziale inviata da Gestione API, come illustrato nell'esempio seguente:
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 risolve il problema. Aggiungere l'intestazione della richiesta sotto la Frontend definizione dell'operazione Di moltiplicazione e quindi impostare il valore come valore predefinito nella scheda Intestazioni . Non è più necessario inviare tale valore di intestazione per ogni richiesta.
Un'operazione di divisione che causa errori HTTP 500 (errore interno del server) indica che il server ha rilevato una condizione imprevista che ha impedito di soddisfare la richiesta. Questa condizione indica che il servizio back-end non può elaborare il corpo della richiesta inviato da Gestione API.
È ora possibile esaminare il corpo della richiesta inviato da Gestione API. Il denominatore (intB) è impostato su zero, che porta a un'eccezione non gestita. Questa condizione è la causa dell'errore HTTP 500 (errore interno del server).
L'esempio seguente mostra il corpo della richiesta inviato dalla traccia dell'Inspector di Gestione API per un'operazione 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>
Quando si controlla la rappresentazione del contenuto della richiesta dalla scheda Richiesta presente nella Frontend definizione dell'operazione di divisione , è possibile notare che il valore intB è impostato su zero. Modificare il valore di intB in un valore diverso da zero. Questa modifica dovrebbe risolvere il problema.