Udostępnij za pośrednictwem


Struktura komunikatu usterek SOAP

Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja.

Odpowiedzi na żądania protokołu SOAP, można wykonać jedną z dwóch form: Sukces odpowiedzi lub odpowiedzi na błędy.Odpowiedź błąd odpowiedzi może zawierać błędy HTTP lub błędów SOAP.Odpowiedź sukces jest zawsze komunikatu SOAP.Aby uzyskać więcej informacji, zobacz Struktura komunikatu odpowiedzi protokołu SOAP.

Błąd HTTP Błąd prawdopodobna może zawierać następujący kod błędu HTTP: "400 Bad request (e.g.invalid header format)."

Jednak po pomyślnym ukończeniu żądania w warstwie protokół HTTP jest przetwarzany przez potoku języka SOAP.Nie generuje odpowiedzi na błędy protokołu HTTP poziom.Po uruchomieniu przetwarzania żądania potoku języka tylko błędy mogą być generowane są błędów SOAP.

Podczas generowania błędów SOAP są zwracane jako błędy HTTP 500.Błędy są generowane w następujących przypadkach: podczas analizowania koperty SOAP, zawarte w żądaniu:

  • Koperta jest nieprawidłowy, takie jak błąd analizy, Brak elementów i tak dalej.

  • Z warunki pamięci podczas analizowania.

  • SQL Server niepowodzenia logowania.

  • Nieobsługiwana operacja SOAP, takie jak procedura składowana, nie znaleziono lub Nieznana operacja określona.

  • Inne błędy, które są przekazywane i przekonwertowane z wykonanie procedura składowana lub funkcja zdefiniowanej przez użytkownika w żądaniu, takie jak numer określone parametry były nieprawidłowe.

W strukturze odpowiedź usterki protokołu SOAP <faultcode> i <Szczegóły> elementy zawierają szczegółowe informacje dodatkowe dotyczące błędu. <Faultcode> element jest zgodne z SOAP 1.1 i usterki protokołu SOAP 1.2 kod specyfikacji.Jednakże <Szczegóły> element zawiera modyfikacji poza specyfikacje protokołu SOAP.Udostępnia te same szczegółowe informacje na temat błędów SOAP klientom protokołu SOAP 1.2 i SOAP 1.1 osadzając kompletną konstrukcję usterki protokołu SOAP 1.2 w <Szczegóły> węzeł usterki protokołu SOAP 1.1.

Wszystkich błędów SOAP należą do jednej z następujących czterech przypadków:

  • Szczegółowe informacje SOAP usterki kod, pod warunkiem, ale żadne komunikaty o błędach programu SQL Server.

    To zachowanie występuje, wynik MYDŁO przyporządkowanie odpowiednie błąd protokołu SOAP.

  • Dostarczane z bardziej szczegółowy komunikat o błędzie programu SQL Server w węźle szczegółów szczegółowe kod usterki protokołu SOAP.

    Niektóre SQL Server komunikaty o błędach są jawnie obsługi i mapowane na odpowiednie błędy protokołu SOAP.

  • "Nieznany błąd SQL" Zwrócony kod usterki protokołu SOAP, wraz z jest bardziej szczegółowy komunikat o błędzie programu SQL Server w <Szczegóły> węzła.

    To zachowanie występuje, błąd SQL podniesiono z gdzieś w kodzie, ale brak specjalnych mapowania do konkretnego błąd protokołu SOAP.

  • "Nieznany błąd SQL" Bez komunikatów o błędach SQL Server został zwrócony kod usterki protokołu SOAP.

    Gdy to zachowanie występuje, nieznany wynik został zwrócony innym i mapowane "Nieznany błąd SQL" Błąd protokołu SOAP.

Próbki SOAP 1.1 usterek

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

Próbki SOAP 1,2 usterek

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>

Przykłady

Domyślnie SQL Server przygotowuje informacji usterki protokołu SOAP 1.2.Dotyczy to informacji dodatkowych błędów nie obsługuje formatu usterki protokołu SOAP 1.1.Dlatego niektóre dodatkowe protokołu SOAP 1.2 związane szczegóły błędu są osadzane jako przepełnienie w SOAP 1.1 <Szczegóły> węzła, gdzie może być analizowany i pobierane przez aplikacje klient protokołu SOAP 1.1.

Następujących wierszy kodu przykładu wykazują jedną możliwą metoda analizy tej informacji usterki protokołu SOAP 1.2 z usterki protokołu SOAP 1.1 zwrócony przez SQL Server.W jego brzmieniu ten kod jest przeznaczona do użycia jako część aplikacji konsoli C#.

Aby zintegrować analizowania i pobieranie szczegółów usterki protokołu SOAP 1.2 SOAP 1.1 aplikacji napisanych w języku C#

  1. Skopiuj następujący blok kodu do istniejącej funkcja w aplikacji konsoli C# używany jako klient wersja protokołu 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. Zastępowanie zawartości try { ... } blok kodu, który jest używany do wysyłania wiadomości żądania protokołu SOAP 1.1 SQL Server.Jeśli trzeba, można także zastąpić Console.WriteLine() wywołania metoda wywołania dowolnej metoda właściwe jest, aby obsługa wyjątków w aplikacji.