Compartilhar via


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.

    Captura de tela da guia Cabeçalhos, onde o cabeçalho SOAPAction com o valor é adicionado.

  • 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.

    Captura de tela do valor intB definido como zero.

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.