Síntomas
La API calculator puede realizar cuatro operaciones: Agregar, Restar, Multiplicar 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.
-
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.
Estos pasos de ayudarán a encontrar la causa y solución para los errores HTTP 404 y 500