Partager via


L’API BASÉE sur SOAP retourne 404 et 500 codes d’état HTTP

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 en fonction de cela, pour recréer le problème.

Version du produit d’origine : service Gestion des API
Numéro de 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’ils 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 transmis dans la section corps de l’enveloppe soap. Les opérations Ajouter et Soustraire fonctionnent correctement comme prévu, mais vous rencontrez HTTP 404 lors de l’appel de l’opération De multiplication et HTTP 500 lors de l’appel de l’opération De division.

La sortie attendue de l’opération De multiplication doit être similaire à 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 De division doit être semblable à 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 dépannage

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

  • L’opération de multiplication lève le code d’état HTTP - 404 (Introuvable) indique que le serveur d’origine n’a pas trouvé de représentation actuelle pour la ressource cible ou n’est pas prêt à divulguer celui-ci.

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

    {
      "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 les comparer avec l’exemple de requête 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 de service ASMX back-end, vous remarquerez que la requête SOAP 1.1 a besoin d’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 front-end de l’opération Multiplier et définir la valeur comme valeur par défaut sous l’onglet En-têtes afin que vous n’ayez pas à envoyer cet en-tête chaque fois sur chaque requête.

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

  • L’opération de division qui lève le code d’état HTTP 500 (erreur de serveur interne) 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 votre corps de requête envoyé à partir d’APIM. Vous pouvez examiner le corps de la requête envoyé à 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 gérée, ce qui provoque une erreur http 500 (erreur de serveur interne).

    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 vérifiez la représentation de contenu de la demande à partir de l’onglet Requête présente dans la définition frontale de l’opération de division, vous remarquerez que la valeur intB est définie sur zéro. Vous devez remplacer la valeur d’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.