A API baseada em SOAP está retornando códigos de status HTTP 404 e 500
Referindo-se ao artigo sobre o Azure Gerenciamento de API Série de Solução de Problemas, este é o segundo cenário do laboratório. Verifique se você seguiu as instruções de instalação do laboratório de acordo com isso, para recriar o problema.
Versão original do produto: Gerenciamento de API Service
Número de KB original: 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 qual função elas executam. É um serviço ASMX (http://www.dneonline.com/calculator.asmx) seguindo o protocolo SOAP 1.1 para que os parâmetros de entrada sejam passados na seção corpo do envelope de sabão. As operações Adicionar e Subtrair estão funcionando bem conforme o esperado, mas você está encontrando HTTP 404 enquanto invoca a operação Multiplique e HTTP 500 enquanto invoca a operação Dividir.
A saída esperada da operação Multiplique 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 a solução de 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 APIM para inspecionar a solicitação e a resposta.
Multiplicar o código HTTP – 404 (Não Encontrado) status indica que o servidor de origem não encontrou uma representação atual para o recurso de destino ou não está disposto a revelar que existe.
Se você examinar a seção back-end do rastreamento do inspetor APIM, a mesma observação também será 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, primeiro você deve examinar a url de solicitação e os cabeçalhos enviados do APIM para a API de back-end da guia Teste e compará-la 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 APIM são semelhantes a abaixo:
{ "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 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 resolve o problema. Você pode adicionar o cabeçalho de solicitação na definição front-end da operação Multiplicar e definir o valor como um 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 de divisão que gera HTTP 500 (Erro interno do servidor) status código 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 da APIM. Você pode examinar o corpo da solicitação enviado da APIM.
Ao verificar o corpo soap, você notaria que o denominador (intB) é definido como zero, levando a uma exceção sem tratamento, causando, portanto, 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ê marcar a representação de conteúdo da solicitação da guia Solicitação presente na definição front-end da operação Dividir, você perceberá que o valor intB está definido como zero. Você precisa alterar o valor do intB para um valor não zero e ele deve resolve 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.