A API baseada em SOAP está retornando códigos de status HTTP 404 e 500
Referindo-se ao artigo sobre a série de solução de problemas do Gerenciamento de API do Azure, este é o segundo cenário do laboratório. Certifique-se de ter seguido as instruções de configuração do laboratório de acordo com isso, para recriar o problema.
Versão original do produto: Serviço de Gerenciamento de API
Número original da base de conhecimento: 4464934
Sintomas
A API da Calculadora pode executar quatro operações - Adicionar, Subtrair, Multiplicar e Dividir com base em dois parâmetros de entrada intA e intB. O nome das operações é autoexplicativo para a função que elas executam. É um serviço ASMX (http://www.dneonline.com/calculator.asmx) seguindo o protocolo SOAP 1.1, portanto, os parâmetros de entrada são passados na seção do corpo do envelope soap. As operações Adicionar e Subtrair estão funcionando bem conforme o esperado, mas você está encontrando HTTP 404 ao invocar a operação Multiplicar e HTTP 500 ao invocar a operação Dividir.
A saída esperada da operação Multiply deve ser algo como abaixo:
<?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>
A saída esperada da operação Divide deve ser algo como abaixo:
<?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>
Etapas para solucionar problemas
Você precisa entender quem está lançando essas respostas HTTP 404 e 500, APIM ou a API SOAP de back-end. A melhor maneira de obter essa resposta é coletar o rastreamento do inspetor do APIM para inspecionar a solicitação e a resposta.
A operação de multiplicação que gera o código de status HTTP - 404 (Não Encontrado) indica que o servidor de origem não encontrou uma representação atual para o recurso de destino ou não está disposto a divulgar que ela existe.
Se você examinar a seção de back-end do rastreamento do inspetor do APIM, a mesma observação também ficará evidente na mensagem:
{ "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." } } ] }
Portanto, você deve primeiro examinar o URL da solicitação e os cabeçalhos enviados do APIM para a API de back-end na guia Teste e compará-los com o exemplo de solicitação SOAP para a operação Multiplicar - http://www.dneonline.com/calculator.asmx.
Os cabeçalhos de solicitação do rastreamento do inspetor do APIM são semelhantes aos seguintes:
{ "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" } ] } } }
De acordo com a definição de serviço ASMX de back-end, você notaria que a solicitação SOAP 1.1 precisa de um cabeçalho de solicitação **SOAPAction que está ausente na solicitação enviada do APIM.
Host: www.dneonline.com Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/Multiply"
Adicionar o cabeçalho SOAPAction com o valor http://tempuri.org/Multiply resolverá o problema. Você pode adicionar o cabeçalho da solicitação na definição de front-end da operação Multiplicar e definir o valor como padrão na guia Cabeçalhos para que você não precise enviar esse cabeçalho todas as vezes em cada solicitação.
A operação Divide que gera o código de status HTTP 500 (Internal Server Error) indica que o servidor encontrou uma condição inesperada que o impediu de atender à solicitação.
Em outras palavras, o serviço de back-end não é capaz de processar o corpo da solicitação enviado do APIM. Você pode examinar o corpo da solicitação enviado do APIM.
Ao verificar o corpo SOAP, você notaria que o denominador (intB) está definido como zero, levando a uma exceção sem tratamento, causando HTTP 500 (Erro Interno do 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>
Se você verificar a representação do conteúdo da solicitação na guia Solicitação presente na definição de front-end da operação Dividir, observará que o valor intB está definido como zero. Você precisa alterar o valor de intB para um valor diferente de zero e isso deve resolver o problema.
Entre em contato conosco para obter ajuda
Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.