Partager via


L’API SOAP retourne les codes de status HTTP 404 et 500

En se référant à l’article sur la série de résolution des problèmes Azure Gestion des API, il s’agit du deuxième scénario du labo. Vérifiez que vous avez suivi les instructions de configuration du labo pour recréer le problème.

Version du produit d’origine : Gestion des API Service
Numéro de la base de connaissances d’origine : 4464934

Symptômes

L’API Calculatrice peut effectuer quatre opérations : Ajouter, Soustraire, Multiplier et Diviser en fonction de deux paramètres d’entrée intA et intB. Le nom des opérations est explicite pour la fonction qu’elles exécutent. Il s’agit d’un service ASMX (http://www.dneonline.com/calculator.asmx) suivant le protocole SOAP 1.1 afin que les paramètres d’entrée soient passés dans la section corps de l’enveloppe soap. Les opérations d’ajout et de soustraction fonctionnent correctement comme prévu, mais vous rencontrez HTTP 404 lors de l’appel de l’opération Multiplier et HTTP 500 lors de l’appel de l’opération Divide.

La sortie attendue de l’opération De multiplication doit ressembler à ce qui suit :

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

La sortie attendue de l’opération Divide doit ressembler à ce qui suit :

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

Étapes de résolution des problèmes

Vous devez comprendre qui lève ces réponses HTTP 404 et 500, APIM ou l’API SOAP back-end. La meilleure façon d’obtenir cette réponse consiste à collecter la trace de l’inspecteur APIM pour inspecter la requête et la réponse.

  • Opération de multiplication lisant HTTP - 404 (introuvable) code status indique que le serveur d’origine n’a pas trouvé de représentation actuelle pour la ressource cible ou n’est pas disposé à divulguer qu’il en existe une.

  • Si vous examinez la section back-end de la trace de l’inspecteur APIM, la même observation est également évidente dans le message :

    {
      "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."
          }
        }
      ]
    }
    
  • Par conséquent, vous devez d’abord examiner l’URL de requête et les en-têtes envoyés d’APIM à l’API back-end à partir de l’onglet Test et le comparer à l’exemple de demande SOAP pour l’opération Multiplier - http://www.dneonline.com/calculator.asmx.

    Les en-têtes de requête de la trace de l’inspecteur APIM ressemblent à ce qui suit :

    {
      "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"
            }
          ]
        }
      }
    }
    
  • Conformément à la définition du service ASMX principal, vous remarquerez que la requête SOAP 1.1 nécessite un en-tête de requête **SOAPAction manquant dans la requête envoyée à partir d’APIM.

    Host: www.dneonline.com
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/Multiply"
    
  • L’ajout d’un en-tête SOAPAction avec la valeur http://tempuri.org/Multiply résout le problème. Vous pouvez ajouter l’en-tête de requête sous la définition frontend de l’opération Multiplier et définir la valeur par défaut sous l’onglet En-têtes afin de ne pas avoir à envoyer cet en-tête à chaque requête.

    Capture d’écran de l’onglet En-têtes, où l’en-tête SOAPAction avec la valeur est ajouté.

  • L’opération de division lève le code de status HTTP 500 (erreur interne du serveur) indique que le serveur a rencontré une condition inattendue qui l’a empêché de répondre à la demande.

  • En d’autres termes, le service back-end n’est pas en mesure de traiter le corps de votre demande envoyée à partir d’APIM. Vous pouvez examiner le corps de la demande envoyée à partir d’APIM.

  • Lors de la vérification du corps SOAP, vous remarquerez que le dénominateur (intB) est défini sur zéro, ce qui entraîne une exception non prise en charge, ce qui provoque http 500 (erreur interne du serveur).

    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>
    
  • Si vous case activée la représentation du contenu de la demande à partir de l’onglet Requête présent dans la définition frontend de l’opération Divide, vous remarquerez que la valeur intB est définie sur zéro. Vous devez remplacer la valeur de intB par une valeur différente de zéro et résoudre le problème.

    Capture d’écran de la valeur intB définie sur zéro.

Contactez-nous pour obtenir de l’aide

Pour toute demande ou assistance, créez une demande de support ou posez une question au support de la communauté Azure. Vous pouvez également soumettre des commentaires sur les produits à la communauté de commentaires Azure.