Compartilhar via


Estrutura de mensagens de falha SOAP

Esse recurso será removido em uma versão futura do Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.

As respostas para solicitações de SOAP podem ser de uma das duas formas: respostas de êxito ou respostas de erro. Para uma resposta de erro, a resposta poderá conter erros de HTTP ou falhas de SOAP. Uma resposta de êxito é sempre uma mensagem de SOAP. Para obter mais informações, consulte Estrutura de mensagens de resposta SOAP.

Para um erro de HTTP, o erro provável poderá incluir o seguinte código de erro de HTTP: "400 Solicitação inválida (por exemplo, formato de cabeçalho inválido)".

Entretanto, depois que uma solicitação foi bem-sucedida na camada de protocolo do HTTP, ela é processada pelo pipe de linguagem SOAP. Isto não gera respostas de erro do nível de HTTP. Depois que o pipe de linguagem começa a processar uma solicitação, os únicos erros que ele pode gerar são falhas de SOAP.

Quando são geradas falhas de SOAP, elas são retornadas como erros HTTP 500. Os erros são gerados nos seguintes casos durante a análise do envelope SOAP que está contido na solicitação:

  • O envelope SOAP não é válido, como um erro de análise, elementos ausentes, e assim por diante.

  • Condições de falta de memória durante a análise.

  • Falhas de login do SQL Server.

  • Operação de SOAP sem suporte, como procedimento armazenado não encontrado ou operação desconhecida especificada.

  • Outros erros que são transmitidos e convertidos pela execução de um procedimento armazenado ou de uma função definida pelo usuário na solicitação, como o número de parâmetros especificados, não foram válidos.

Na estrutura de uma resposta de falha de SOAP, os elementos <faultcode> e <detail> fornecem informações adicionais específicas sobre o erro. O elemento <faultcode> é consistente com as especificações dos códigos de falha SOAP 1.1 e SOAP 1.2. Porém, o elemento <detail> inclui uma modificação fora das especificações de SOAP. Ele fornece as mesmas informações detalhadas sobre falhas de SOAP para os clientes SOAP 1.2 e SOAP 1.1, incorporando a estrutura completa de falha de SOAP 1.2 no nó <detail> de uma falha de SOAP 1.1.

Todas as falhas de SOAP pertencem a um dos quatro casos a seguir:

  • Informações detalhadas do código de falha de SOAP fornecidas, mas sem mensagens de erro de SQL Server.

    Quando este comportamento ocorrer, o resultado de SOAP será mapeado para uma falha de SOAP apropriada.

  • Código de falha de SOAP detalhada fornecido, com mensagens de erro mais detalhadas do SQL Server nó de detalhe.

    Algumas mensagens de erro do SQL Server são tratadas explicitamente e mapeadas para as falhas de SOAP apropriadas.

  • Um código de falha de SOAP 'erro de SQL desconhecido' foi retornado, junto com uma mensagem de erro do SQL Server mais detalhada no nó <detail>.

    Quando este comportamento ocorre, um erro de SQL foi obtido de algum lugar no código, mas não há mapeamento especial para uma falha de SOAP específica.

  • Um código de falha de SOAP 'erro de SQL desconhecido' foi retornado sem mensagens de erro do SQL Server.

    Quando este comportamento ocorre, um resultado desconhecido foi retornado em algum lugar e mapeado para a falha de SOAP 'erro de SQL desconhecido'.

Exemplo de falha 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>

Exemplo de falha 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>

Exemplos

Por padrão, o SQL Server prepara informações de falha de SOAP 1.2. Isto inclui informações de falha adicionais que o formato de falha do SOAP 1.1 não tem suporte. Portanto, alguns detalhes adicionais de falhas relacionadas ao SOAP 1.2 são incorporados como estouro no nó <Details> do SOAP 1.1, nos quais eles podem ser analisados e recuperados pelos aplicativos cliente do SOAP 1.1.

As linhas a seguir de código de exemplo demonstram um método possível de análise fora destas informações de falha do SOAP 1.2 provenientes de uma falha do SOAP 1.1 retornada pelo SQL Server. Da maneira como aparece, esse código parece ser usado como parte de um aplicativo do console C#.

Para integrar análise e recuperação de detalhes de falha de SOAP 1.2 em seu aplicativo SOAP 1.1 gravado em C#

  1. Copie o seguinte bloco de código para uma função existente em seu aplicativo de console C# usado para agir como um cliente da versão 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. Substitua o conteúdo do bloco try { ... } pelo código que é usado para enviar uma mensagem de solicitação de SOAP 1.1 para o SQL Server. Se for necessário, você poderá também substituir as chamadas do método Console.WriteLine() por uma chamada para a qual qualquer método seja apropriado para manipulação de exceção no aplicativo.