Structure des messages d'erreur SOAP

Cette fonctionnalité sera supprimée dans une prochaine version de Microsoft SQL Server. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité.

Les réponses aux demandes SOAP peuvent prendre l'une des deux formes suivantes : réponses de réussite ou réponses d'erreur. Pour une réponse d'erreur, la réponse peut contenir des erreurs HTTP ou des erreurs SOAP. Une réponse de réussite est toujours un message SOAP. Pour plus d'informations, consultez Structure des messages de réponse SOAP.

Pour une erreur HTTP, l'erreur probable peut inclure le code d'erreur HTTP suivant : « 400 Requête incorrecte (format d'en-tête non valide) ».

Cependant, après la réussite d'une demande au niveau de la couche du protocole HTTP, la demande est traitée par le canal de langage SOAP. Cette opération ne génère pas de réponse d'erreur au niveau de HTTP. Une fois que le canal de langage a commencé à traiter une demande, les seules erreurs qu'il peut générer sont des erreurs SOAP.

Lorsque des erreurs SOAP sont générées, elles sont retournées sous la forme d'erreurs HTTP 500. Les erreurs sont générées dans les cas suivants lors de l'analyse de l'enveloppe SOAP qui est contenue dans la demande :

  • Enveloppe SOAP non valide ; par exemple, une erreur d'analyse, des éléments manquants, etc.

  • Conditions de mémoire saturée durant l'analyse.

  • Échecs de connexion à SQL Server.

  • Opération SOAP non gérée ; par exemple, une procédure stockée introuvable ou une opération inconnue spécifiée.

  • Autres erreurs transférées et converties à partir de l'exécution d'une procédure stockée ou d'une fonction définie par l'utilisateur dans la demande ; par exemple, le nombre de paramètres spécifié n'était pas valide.

Dans la structure d'une réponse d'erreur SOAP, les éléments <faultcode> et <detail> fournissent des informations complémentaires spécifiques concernant l'erreur. L'élément <faultcode> correspond aux spécifications de code d'erreur SOAP 1.1 et SOAP 1.2. Toutefois, l'élément <detail> inclut une modification hors des spécifications SOAP. Il fournit les mêmes informations détaillées concernant les erreurs SOAP aux clients SOAP 1.2 et SOAP 1.1 en incorporant l'ensemble de la structure d'erreur SOAP 1.2 dans le nœud <detail> d'une erreur SOAP 1.1.

Les erreurs SOAP sont réparties dans l'une des quatre catégories suivantes :

  • Des informations détaillées de code d'erreur SOAP sont fournies, sans message d'erreur SQL Server.

    Lorsque ce comportement survient, le résultat SOAP correspond à une erreur SOAP appropriée.

  • Un code d'erreur SOAP détaillé est fourni, accompagné d'un message d'erreur SQL Server plus détaillé dans le nœud des détails.

    Certains messages d'erreur SQL Server sont explicitement traités et associés aux erreurs SOAP appropriées.

  • Un code d'erreur SOAP « erreur SQL inconnue » a été retourné, accompagné d'un message d'erreur SQL Server plus détaillé dans le nœud <detail>.

    Lorsque ce comportement survient, une erreur SQL a été générée quelque part dans le code, mais aucune erreur SOAP spécifique ne lui est associée.

  • Un code d'erreur SOAP « erreur SQL inconnue » a été retourné, sans aucun message d'erreur SQL Server.

    Lorsque ce comportement survient, un résultat inconnu a été retourné quelque part, puis il a été associé à l'erreur SOAP « erreur SQL inconnue ».

Exemple d'erreur SOAP 1.1

<SOAP-ENV:Fault xmlns:sqlsoapfaultcode="https://schemas.microsoft.com/sqlserver/2004/SOAP/SqlSoapFaultCode">
  <faultcode>SOAP-ENV:Client</faultcode>
  <faultstring>There was an error in the incoming SOAP request packet:  Client, InvalidXml</faultstring>
  <faultactor>https://schemas.microsoft.com/sqlserver/2004/SOAP</faultactor>
  <detail xmlns:SOAP-1_2-ENV="http://www.w3.org/2003/05/soap-envelope">
    <SOAP-1_2-ENV:Code>
      <SOAP-1_2-ENV:Value>SOAP-1_2-ENV:Sender</SOAP-1_2-ENV:Value>
      <SOAP-1_2-ENV:Subcode>
         <SOAP-1_2-ENV:Value>sqlsoapfaultcode:InvalidXml</SOAP-1_2-ENV:Value>
      </SOAP-1_2-ENV:Subcode>
    </SOAP-1_2-ENV:Code>
    <SOAP-1_2-ENV:Reason>
      <SOAP-1_2-ENV:Text xml:lang="en-US">There was an error in the incoming SOAP request packet:  Sender, InvalidXml</SOAP-1_2-ENV:Text>
    </SOAP-1_2-ENV:Reason>
    <SOAP-1_2-ENV:Node>http://MyServer:80/sql</SOAP-1_2-ENV:Node>
    <SOAP-1_2-ENV:Role>https://schemas.microsoft.com/sqlserver/2004/SOAP</SOAP-1_2-ENV:Role>
    <SOAP-1_2-ENV:Detail>
      <sqlresultstream:SqlMessage xsi:type="sqlmessage:SqlMessage">
         <sqlmessage:Class>16</sqlmessage:Class>
         <sqlmessage:LineNumber>0</sqlmessage:LineNumber>
         <sqlmessage:Message>XML parsing: line 3, character 0, incorrect document syntax</sqlmessage:Message>
         <sqlmessage:Number>9422</sqlmessage:Number>
         <sqlmessage:Source>Microsoft-SQL/9.0</sqlmessage:Source>
         <sqlmessage:State>1</sqlmessage:State>
      </sqlresultstream:SqlMessage>
    </SOAP-1_2-ENV:Detail>
  </detail>
</SOAP-ENV:Fault>

Exemple d'erreur SOAP 1.2

SOAP-1_2-ENV:Fault xmlns:sqlsoapfaultcode="https://schemas.microsoft.com/sqlserver/2004/SOAP/SqlSoapFaultCode">
  <SOAP-1_2-ENV:Code>
    <SOAP-1_2-ENV:Value>SOAP-1_2-ENV:Sender</SOAP-1_2-ENV:Value>
    <SOAP-1_2-ENV:Subcode>
      <SOAP-1_2-ENV:Value>sqlsoapfaultcode:InvalidXml</SOAP-1_2-ENV:Value>
    </SOAP-1_2-ENV:Subcode>
  </SOAP-1_2-ENV:Code>
  <SOAP-1_2-ENV:Reason>
    <SOAP-1_2-ENV:Text xml:lang="en-US">There was an error in the incoming SOAP request packet:  Sender, InvalidXml</SOAP-1_2-ENV:Text>
  </SOAP-1_2-ENV:Reason>
  <SOAP-1_2-ENV:Node>http://MyServer:80/sql</SOAP-1_2-ENV:Node>
  <SOAP-1_2-ENV:Role>https://schemas.microsoft.com/sqlserver/2004/SOAP</SOAP-1_2-ENV:Role>
  <SOAP-1_2-ENV:Detail>
    <sqlresultstream:SqlMessage xsi:type="sqlmessage:SqlMessage">
      <sqlmessage:Class>16</sqlmessage:Class>
      <sqlmessage:LineNumber>0</sqlmessage:LineNumber>
      <sqlmessage:Message>XML parsing: line 3, character 0, incorrect document syntax</sqlmessage:Message>
      <sqlmessage:Number>9422</sqlmessage:Number>
      <sqlmessage:Source>Microsoft-SQL/9.0</sqlmessage:Source>
      <sqlmessage:State>1</sqlmessage:State>
    </sqlresultstream:SqlMessage>
  </SOAP-1_2-ENV:Detail>
</SOAP-1_2-ENV:Fault>

Exemples

Par défaut, SQL Server prépare les informations d'erreur SOAP 1.2. Il s'agit notamment des informations d'erreur supplémentaires que le format d'erreur SOAP 1.1 ne gère pas. Par conséquent, certains détails d'erreur complémentaires liés à SOAP 1.2 sont incorporés en tant que débordement dans le nœud <Details> de SOAP 1.1, où ils peuvent être analysés et extraits par les applications clientes SOAP 1.1.

Les lignes de code suivantes présentent une méthode possible d'analyse de ces informations d'erreur SOAP 1.2 à partir d'une erreur SOAP 1.1 retournée par SQL Server. Tel quel, ce code est destiné à être utilisé dans le cadre d'une application console C#.

Pour intégrer l'analyse et l'extraction des détails d'erreur SOAP 1.2 dans votre application SOAP 1.1 écrite en C#

  1. Copiez le bloc de code suivant dans une fonction existante de votre application console C# utilisée comme client de la version SOAP 1.1.

    try
    {
    ...
    }
    catch (System.Web.Services.Protocols.SoapException soapE)
    {
        // SOAP 1.1 Fault info
        Console.WriteLine("SOAP 1.1 fault...");
        Console.WriteLine("Code: " + soapE.Code.ToString());
        Console.WriteLine("Actor: " + soapE.Actor);
        Console.WriteLine("Detail: " + soapE.Detail.InnerXml);
    
        // Extract SOAP 1.2 Fault info from the Details node
        System.Xml.XmlNode fault12 = soapE.Detail;
    
    // Setup the namespace manager to use with XPath query
        System.Xml.NameTable nsTbl = new System.Xml.NameTable();
        System.Xml.XmlNamespaceManager nsMgr = new System.Xml.XmlNamespaceManager(nsTbl);
        nsMgr.AddNamespace("SOAP-1_2-ENV", "http://www.w3.org/2003/05/soap-envelope");
    
        Console.WriteLine("\r\nSOAP 1.2 fault...");
    
        // Fault Code
        // Using SelectNodes() method because SOAP 1.2 fault code are allowed to have sub-codes,
        // this way all the fault codes are retrieved at the same time.
        System.Xml.XmlNodeList myNodes = fault12.SelectNodes(".//SOAP-1_2-ENV:Value", nsMgr);
        foreach (System.Xml.XmlNode n in myNodes)
        {
            Console.WriteLine(n.ParentNode.LocalName + ": " + n.InnerText);
        }
    
        // Fault Reason
        // SOAP 1.2 fault reason can be in multiple languages which represented as sibling "Text" child
        // nodes under the "Reason" node
        myNodes = fault12.SelectNodes(".//SOAP-1_2-ENV:Reason/SOAP-1_2-ENV:Text", nsMgr);
        foreach (System.Xml.XmlNode n in myNodes)
        {
            Console.WriteLine(n.ParentNode.LocalName + ": " + n.InnerText);
        }
    
        // Fault Node
        System.Xml.XmlNode faulNode = fault12.SelectSingleNode(".//SOAP-1_2-ENV:Node", nsMgr);
        Console.WriteLine(faulNode.LocalName + ": " + faulNode.InnerText);
    
        // Fault Role
        faulNode = fault12.SelectSingleNode(".//SOAP-1_2-ENV:Role", nsMgr);
        Console.WriteLine(faulNode.LocalName + ": " + faulNode.InnerText);
    }
    
  2. Remplacez le contenu du bloc try { ... } par le code qui est utilisé pour envoyer un message de demande SOAP 1.1 à SQL Server. Lorsque cela est indispensable, vous pouvez également remplacer les appels de la méthode Console.WriteLine() par un appel de la méthode appropriée pour la gestion des exceptions dans votre application.