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