Azure API Management: Códigos de estado HTTP 404 y 500

Síntomas

La API calculator puede realizar cuatro operaciones: AgregarRestarMultiplicar y Dividir en función de dos parámetros de entrada intA e intB. El nombre de las operaciones se explica por sí mismo en función de la función que realizan. Se trata de un servicio ASMX (http://www.dneonline.com/calculator.asmx) que sigue el protocolo SOAP 1.1, por lo que los parámetros de entrada se pasan en la sección cuerpo del sobre soap. Las operaciones Add y Subtract funcionan correctamente según lo esperado, pero se encuentra con HTTP 404 al invocar la operación Multiply y HTTP 500 al invocar la operación Divide.

La salida esperada de la operación Multiplicar debe ser similar a la siguiente:

<?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>

La salida esperada de la operación Dividir debe ser similar a la siguiente:

<?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>

Pasos para la solución de problemas

Debe comprender quién genera estas respuestas HTTP 404 y 500, APIM o la API SOAP de back-end. La mejor manera de obtener esa respuesta es recopilar el seguimiento del inspector de APIM para inspeccionar la solicitud y la respuesta.

  • La operación de multiplicación que genera el código de estado HTTP - 404 (no encontrado) indica que el servidor de origen no encontró una representación actual para el recurso de destino o que no está dispuesto a revelar que existe una.

  • Si examina la sección back-end del seguimiento del inspector de APIM, también se evidencia la misma observación en el mensaje:

{
"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."
}
}
]
}

Por lo tanto, primero debe examinar la dirección URL de la solicitud y los encabezados enviados desde APIM a la API back-end desde la pestaña Prueba y compararla con el ejemplo de solicitud SOAP para la operación Multiplicar: http://www.dneonline.com/calculator.asmx.

Los encabezados de solicitud del seguimiento del inspector de APIM tienen un aspecto similar al siguiente:

{
"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"
}
]
}
}
}

Según la definición del servicio ASMX de back-end, observaría que la solicitud SOAP 1.1 necesita un encabezado de solicitud **SOAPAction que falta en la solicitud enviada desde APIM.

Host: www.dneonline.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/Multiply"

Al agregar el encabezado SOAPAction con el valor http://tempuri.org/Multiply , se resolverá el problema. Puede agregar el encabezado de solicitud en la definición de front-end de la operación Multiplicar y establecer el valor como predeterminado en la pestaña Encabezados para que no tenga que enviar ese encabezado cada vez en cada solicitud.

Captura de pantalla de la pestaña Encabezados, donde se agrega el encabezado SOAPAction con el valor .

  • La operación de división que genera el código de estado HTTP 500 (error interno del servidor) indica que el servidor encontró una condición inesperada que impedía que cumpliera la solicitud.

  • En otras palabras, el servicio back-end no puede procesar el cuerpo de la solicitud enviado desde APIM. Puede examinar el cuerpo de la solicitud enviado desde APIM.

  • Al comprobar el cuerpo soap, observaría que el denominador (intB) se establece como cero, lo que conduce a una excepción no controlada, lo que provoca http 500 (error interno del servidor).

    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>
  • Si comprueba la representación de contenido de la solicitud desde la pestaña Solicitud presente en la definición de front-end de la operación Dividir, observaría que el valor intB está establecido en cero. Debe cambiar el valor de intB a un valor distinto de cero y debe resolver el problema.

Captura de pantalla del valor intB que se establece en cero.


Estos pasos de ayudarán a encontrar la causa y solución para los errores HTTP 404 y 500