Compartir a través de


Estructura de los mensajes de error SOAP

Esta característica se quitará en una versión futura de Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.

Las respuestas a solicitudes SOAP pueden presentarse en forma de respuesta de acción correcta o de error. En los casos de error, las respuestas pueden incluir errores HTTP o SOAP. Una respuesta de acción correcta siempre es un mensaje SOAP. Para obtener más información, vea Estructura de los mensajes de respuesta SOAP.

En el caso de errores HTTP, puede que el error probable incluya el código de error HTTP "400 Solicitud incorrecta" (por ejemplo, formato de encabezado no válido).

Sin embargo, cuando una solicitud se ha realizado correctamente en la capa del protocolo HTTP, la procesa la canalización de lenguaje SOAP. No se generan respuestas de error en el nivel HTTP. Una vez que la canalización de lenguaje empieza a procesar una solicitud, los únicos errores que puede generar son los errores SOAP.

En este caso, se devuelven como errores HTTP 500. Estos errores se generan en los casos que se indican a continuación al analizar SOAP ENVELOPE incluido en la solicitud:

  • SOAP ENVELOPE no es válido, por ejemplo, a causa de un error de análisis, porque faltan elementos, etc.

  • Condiciones de memoria insuficiente durante el análisis.

  • Errores de inicio de sesión de SQL Server.

  • Una operación SOAP incompatible, como un procedimiento almacenado no encontrado o una operación desconocida.

  • Otros errores que se pasan y se convierten a partir de la ejecución de un procedimiento almacenado o una función definida por el usuario en la solicitud, como el hecho de que el número de parámetros especificados no sea válido.

En la estructura de una respuesta de error SOAP, los elementos <faultcode> y <detail> proporcionan información específica adicional acerca del error. El elemento <faultcode> es coherente con las especificaciones de código erróneo SOAP 1.1 y SOAP 1.2. No obstante, el elemento <detail> incluye una modificación fuera de las especificaciones SOAP. Proporciona la misma información detallada acerca de los errores SOAP tanto a los clientes SOAP 1.2 como SOAP 1.1 incrustando la estructura de errores completa de SOAP 1.2 en el nodo <detail> de un error SOAP 1.1.

Todos los errores SOAP pertenecen a uno de los cuatro casos siguientes:

  • Se ha proporcionado información detallada del código de error SOAP, pero ningún mensaje de error de SQL Server.

    Cuando se produce este comportamiento, se asigna el resultado SOAP a un error SOAP apropiado.

  • Se ha proporcionado información detallada del código de error SOAP con más información detallada de los mensajes de error de SQL Server en el nodo de detalle.

    Algunos mensajes de error de SQL Server se administran y asignan de forma explícita a los errores SOAP apropiados.

  • Se ha devuelto un código de error SOAP del tipo 'error de SQL desconocido' junto con un mensaje de error de SQL Server más detallado en el nodo <detalle>.

    Cuando se produce este comportamiento, significa que se ha generado un error SQL en alguna parte del código, pero no se ha realizado ninguna asignación especial a un error SOAP determinado.

  • Se ha devuelto un código de error SOAP del tipo 'error de SQL desconocido' sin ningún mensaje de error de SQL Server.

    Cuando se produce este comportamiento, significa que se ha devuelto un resultado desconocido en alguna parte y que se ha asignado a un código de error SOAP del tipo 'error de SQL desconocido'.

Ejemplo de error de 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>

Ejemplo de error de 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>

Ejemplos

SQL Server prepara la información de errores de SOAP 1.2 de forma predeterminada. Incluye información adicional acerca de los errores incompatible con el formato de errores de SOAP 1.1. Por tanto, algunos detalles de error adicionales relacionados con SOAP 1.2 se incrustan como desbordamiento en el nodo <Details> de SOAP 1.1, donde los pueden analizar y recuperar aplicaciones cliente de SOAP 1.1.

En el ejemplo de código siguiente se muestra una de las formas posibles de analizar esta información de error de SOAP 1.2 de un error de SOAP 1.1 devuelto por SQL Server. Tal como se proporciona, este código está pensado para utilizarlo como parte de una aplicación de consola C#.

Para integrar el análisis y la recuperación de detalles de error de SOAP 1.2 en la aplicación SOAP 1.1 escrita en C#

  1. Copie el bloque de código siguiente en una función existente de la aplicación de consola C# utilizada para actuar como cliente de versión de 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. Sustituya el contenido del bloque try { ... } con el código utilizado para enviar un mensaje de solicitud SOAP 1.1 a SQL Server. Si es preciso, también puede sustituir las llamadas al método Console.WriteLine() por una llamada al método apropiado para el control de excepciones de la aplicación.