Compartilhar via


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.

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

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

    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.