La API basada en SOAP devuelve códigos de estado HTTP 404 y 500
Consulte el artículo sobre la serie de solución de problemas de Azure API Management, este es el segundo escenario del laboratorio. Asegúrese de que ha seguido las instrucciones de configuración del laboratorio según esto para volver a crear el problema.
Versión original del producto: servicio API Management
Número de KB original: 4464934
Síntomas
La API de calculadora 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 es autoexplicativo a la función que realizan. Es un servicio ASMX (http://www.dneonline.com/calculator.asmx) que sigue al protocolo SOAP 1.1 para que los parámetros de entrada se pasen en la sección cuerpo del sobre soap. Las operaciones de agregar y restar funcionan bien según lo previsto, pero se encuentra con HTTP 404 al invocar la operación Multiplicar y HTTP 500 al invocar la operación De división.
La salida esperada de la operación De multiplicación 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 Divide 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 solucionar problemas
Debe comprender quién inicia 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 produce 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 no está dispuesto a revelar que existe.
Si examina la sección back-end del seguimiento del inspector de APIM, también se muestra la misma observación del 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 de back-end desde la pestaña Prueba y compararlo 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 produce código de estado HTTP 500 (error interno del servidor) indica que el servidor encontró una condición inesperada que impedía que cumpla 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 del contenido de la solicitud en 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.
Ponte en contacto con nosotros para obtener ayuda
Si tiene preguntas o necesita ayuda, cree una solicitud de soporte o busque consejo en la comunidad de Azure. También puede enviar comentarios sobre el producto con los comentarios de la comunidad de Azure.