Solucionar problemas de erros HTTP 404 e HTTP 500 da API baseada em SOAP

Resumo

Este artigo explica como solucionar problemas de uma API baseada em SOAP que retorna erros HTTP 404 e HTTP 500 em Gerenciamento de API do Azure.

Este artigo é o segundo cenário do laboratório da série de solução de problemas do Gerenciamento de API do Azure. Siga as instruções de instalação do laboratório de acordo com as instruções de laboratório da série de solução de problemas do Gerenciamento de API.

Versão original do produto: Serviço de Gerenciamento de API
Número original da base de conhecimento: 4464934

Sintomas

A API da Calculadora encontrada executa http://www.dneonline.com/calculator.asmx quatro operações: Adicionar, Subtrair, Multiplicar e Dividir, com base em dois parâmetros de entrada: intA e intB. Essa API usa um serviço baseado em arquivo ASMX que usa o protocolo SOAP (Simple Object Access Protocol) 1.1 para que os parâmetros de entrada sejam passados no corpo do envelope SOAP.

Nesse cenário, as operações Adicionar e Subtrair funcionam conforme o esperado, mas você encontra erros HTTP 404 ao executar uma operação Multiplicar e erros HTTP 500 ao executar uma operação Divide .

A saída esperada de uma operação Multiplicar deve ser algo semelhante ao exemplo a seguir:

<?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 de uma operação Divide deve ser algo semelhante ao exemplo a seguir:

<?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>

Solução de problemas

Para determinar o que causa as respostas HTTP 404 e HTTP 500 (seja o Gerenciamento de API ou a API SOAP de back-end), colete um rastreamento do inspetor de Gerenciamento de API para inspecionar a solicitação e a resposta.

Se várias operações causarem erros HTTP 404 ou HTTP 500 , isso indicará que o servidor de origem não pode encontrar uma representação atual para o recurso de destino ou não é capaz de divulgar que existe.

Quando você examina a seção de back-end de um rastreamento do Inspetor de Gerenciamento de API, a mesma observação fica evidente na mensagem, conforme mostrado no exemplo a seguir:

    {
      "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."
          }
        }
      ]
    }

Primeiro, você precisa examinar a URL da solicitação e os cabeçalhos enviados pelo Gerenciamento de API para a API de back-end em Teste e compará-los com um exemplo de solicitação SOAP para a operação Multiplicar que você executou em http://www.dneonline.com/calculator.asmx.

Os cabeçalhos de solicitação de um rastreamento do inspetor do API Management são semelhantes ao exemplo a seguir:

    {
      "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"
            }
          ]
        }
      }
    }

A solicitação SOAP 1.1 precisa de um cabeçalho SOAPAction de solicitação ausente na solicitação inicial enviada do Gerenciamento de API, conforme mostrado no exemplo a seguir:

    Host: www.dneonline.com
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/Multiply"

Adicionar o SOAPAction cabeçalho com o valor http://tempuri.org/Multiply resolve o problema. Adicione o cabeçalho da solicitação na Frontend definição da operação Multiplicar e defina o valor como um valor padrão na guia Cabeçalhos . Você não precisa mais enviar esse valor de cabeçalho para cada solicitação.

Captura de tela da guia Cabeçalhos da operação Multiply, mostrando o cabeçalho SOAPAction e seu valor padrão.

Uma operação Divide que causa erros HTTP 500 (Erro interno do servidor) indica que o servidor encontrou uma condição inesperada que o impediu de atender à solicitação. Essa condição significa que o serviço de back-end não pode processar o corpo da solicitação enviado do Gerenciamento de API.

Agora você pode examinar o corpo da solicitação enviado do Gerenciamento de API. O denominador (intB) é definido como zero, o que leva a uma exceção sem tratamento. Essa condição é a causa do HTTP 500 (Erro interno do servidor).

O exemplo a seguir mostra o corpo da solicitação enviado pelo rastreamento do inspetor do Gerenciamento de API para a operação Divide:

    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>

Ao verificar a representação de conteúdo da solicitação na guia Solicitação presente na Frontend definição da operação Dividir , você pode ver que o valor intB está definido como zero. Altere o valor de intB para um valor diferente de zero. Essa alteração deve resolver o problema.

Captura de tela da guia Solicitação da operação Divide com o valor de entrada intB definido como zero.