Risolvere gli errori HTTP 404 e HTTP 500 dell'API basata su SOAP

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.

Schermata della scheda Intestazioni dell'operazione Multiply con l'intestazione SOAPAction e il relativo valore predefinito.

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.

Schermata della scheda Richiesta dell'operazione Divide con il valore di input intB impostato su zero.