Udostępnij za pośrednictwem


Struktura komunikat Błąd protokołu SOAP

This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Odpowiedzi na żądania protokołu SOAP, można wykonać jedną z dwóch formach: odpowiedzi na sukces lub odpowiedzi na błędy. W postaci odpowiedzi błąd odpowiedź może zawierać błędy HTTP lub błędy protokołu SOAP.Odpowiedź sukcesu jest zawsze komunikatu SOAP.Aby uzyskać więcej informacji zobaczStruktura wiadomości 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 żądania w warstwie protokół HTTP, jest ono przetwarzane przez potoku języka protokół SOAP.Nie będzie generował odpowiedzi na błędy protokołu HTTP poziom.Po uruchomieniu przetwarzania żądania potoku języka tylko błędy mogą być generowane są błędy protokołu 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 protokołu SOAP, który jest zawarty w żądaniu:

  • Koperta protokołu SOAP nie jest prawidłowy, takie jak błąd analizowania, brakujących elementów i tak dalej.

  • Z warunków pamięci podczas analizowania składni.

  • SQL Server Błędy logowania.

  • Nieobsługiwana operacja protokołu SOAP, takie jak procedura przechowywana, nie można odnaleźć lub Nieznana operacja określona.

  • Inne błędy, które są przekazywane za pośrednictwem i powsta³e w wyniku wykonania procedura przechowywana lub funkcja zdefiniowanej przez użytkownika w żądaniu, takie jak liczba parametrów określonych nie były prawidłowe.

W strukturze odpowiedź błąd protokołu SOAP <faultcode> i <Szczegóły> elementy dostarczają szczegółowych informacji dodatkowych o błędzie. The <faultcode> element is consistent with the SOAP 1.1 and SOAP 1.2 fault code specifications.Jednak <Szczegóły> element zawiera modyfikacji poza specyfikacje protokołu SOAP. Zawiera te same informacje szczegółowe o błędach protokołu SOAP klientom protokołu SOAP 1.2 i protokołu SOAP 1.1 osadzając Pełna struktura usterki protokołu SOAP 1.2 w <Szczegóły> węzeł błąd protokołu SOAP 1.1.

Wszystkie błędy protokołu SOAP należą do jednej z czterech następujących przypadków:

  • Szczegółowe informacje protokołu SOAP usterki kod, pod warunkiem, ale bez komunikatów o błędach programu SQL Server.

    W takiej sytuacji wynik SOAP mapuje odpowiednie błąd protokołu SOAP.

  • Dostarczone 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ą bezpośrednio obsługiwane i mapowane na odpowiednie błędy protokołu SOAP.

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

    W takiej sytuacji błąd SQL podniesiono z lokalizacji w kodzie, ale Brak mapowania specjalne do określonej błąd protokołu SOAP.

  • "Nieznany błąd SQL „ kod usterki protokołu SOAP zostało zwrócone bez komunikatów o błędach programu SQL Server.

    W takiej sytuacji nieznany wynik został zwrócony w innym miejscu i mapowany na błąd protokołu SOAP nieznany błąd programu SQL.

Przykładowe MYDŁO 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>

Przykładowe MYDŁO 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 błąd protokołu SOAP 1.2. Dotyczy to informacji dodatkowych błędów nie obsługuje formatu błąd protokołu SOAP 1.1.Dlatego niektóre dodatkowe protokołu SOAP 1.2 związanych z usterek osadzone informacje szczegółowe jako przepełnienie w protokołu SOAP 1.1 <Szczegóły> węzeł, gdzie one można analizować i pobierane przez aplikacje klient protokołu SOAP 1.1.

Następujące wiersze kodu przykładowego wykazać podczas analizowania tej informacji błąd protokołu SOAP 1.2 z usterki protokołu SOAP 1.1, zwracane przez jedną metoda możliwe SQL Server. Obowiązujące, kod ten jest przeznaczone do użycia jako część aplikacji konsoli C#.

Aby zintegrować podczas analizowania i pobieranie szczegółów błąd protokołu SOAP 1.2 aplikacji SOAP 1.1 napisane w języku C#

  1. Skopiuj następujący blok kodu do istniejącej funkcja w aplikacji konsoli C# używane do pracy w charakterze klientów w 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 { ... } blokowanie z kodem, który jest używany do wysyłania wiadomości żądania protokołu SOAP 1.1 SQL Server. Jeśli zachodzi potrzeba, można także zastąpić Console.WriteLine() wywołania metody z wywołaniem niezależnie od tego, jaka metoda jest odpowiednia dla obsługa wyjątków w aplikacji.