Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Resumen
En este artículo se explica cómo solucionar problemas de una API basada en SOAP que devuelve errores HTTP 404 y HTTP 500 en Azure API Management.
Este artículo es el segundo escenario del laboratorio de la serie de solución de problemas de Azure API Management. Asegúrese de seguir las instrucciones de configuración del laboratorio de acuerdo con las instrucciones del laboratorio de la serie sobre solución de problemas de API Management.
Versión original del producto: servicio API Management
Número de KB original: 4464934
Síntomas
La API de calculadora que se encuentra en http://www.dneonline.com/calculator.asmx realiza cuatro operaciones: Agregar, Restar, Multiplicar y Dividir, en función de dos parámetros de entrada: intA y intB. Esta API usa un servicio basado en archivos ASMX que usa el protocolo simple de acceso a objetos (SOAP) 1.1 para que los parámetros de entrada se pasen en el cuerpo del sobre SOAP.
En este escenario, las operaciones Agregar y Restar funcionan según lo previsto, pero se producen errores HTTP 404 al realizar una operación de multiplicación y errores HTTP 500 al realizar una operación De división .
La salida esperada de una operación De multiplicación debe ser similar a la del ejemplo 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 una operación Divide debe ser similar a la del ejemplo 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>
Solución de problemas
Para determinar qué causas provocan las respuestas HTTP 404 y HTTP 500 (ya sea API Management o la API SOAP de back-end), recopile un seguimiento del inspector de API Management para inspeccionar la solicitud y la respuesta.
Si varias operaciones provocan errores HTTP 404 o HTTP 500 , indica que el servidor de origen no encuentra una representación actual para el recurso de destino o no puede revelar que existe.
Al examinar la sección de backend de una traza del inspector de API Management, se observa lo mismo en el mensaje, como se muestra en el ejemplo siguiente:
{
"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."
}
}
]
}
Primero debe examinar la dirección URL de solicitud y los encabezados enviados desde API Management a la API de back-end desde Test y compararlos con un ejemplo de solicitud SOAP para la operación Multiplicar que ha realizado en http://www.dneonline.com/calculator.asmx.
En una traza del inspector de API Management, los encabezados de solicitud son similares a los del ejemplo 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"
}
]
}
}
}
La solicitud SOAP 1.1 necesita un encabezado SOAPAction de solicitud que falta en la solicitud inicial enviada desde API Management, como se muestra en el ejemplo siguiente:
Host: www.dneonline.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/Multiply"
Agregar el SOAPAction encabezado con el valor http://tempuri.org/Multiply resuelve el problema. Agregue el encabezado de solicitud bajo la Frontend definición de la operación Multiplicar y, a continuación, establezca el valor como un valor predeterminado en la pestaña Encabezados . Ya no es necesario enviar ese valor de encabezado para cada solicitud.
Una operación de división que provoca errores HTTP 500 (error interno del servidor) indica que el servidor encontró una condición inesperada que impedía que cumpla la solicitud. Esta condición significa que el servicio back-end no puede procesar el cuerpo de la solicitud enviado desde API Management.
Ahora puede examinar el cuerpo de la solicitud enviado desde API Management. El denominador (intB) se establece en cero, lo que conduce a una excepción no controlada. Esta condición es la causa de HTTP 500 (error interno del servidor).
En el ejemplo siguiente se muestra el cuerpo de la solicitud enviado desde el seguimiento del inspector de API Management para una operación 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>
Al comprobar la representación de contenido de la solicitud en la pestaña Solicitud presente en la Frontend definición de la operación Dividir , puede ver que el valor intB está establecido en cero. Cambie el valor de intB a un valor distinto de cero. Este cambio debe resolver el problema.