Struktur der SOAP-Fehlernachricht
Diese Funktion wird in zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird.
Antworten auf SOAP-Anforderungen können zwei Formen besitzen: Erfolgsantworten und Fehlerantworten. Bei einer Fehlerantwort kann die Antwort entweder HTTP- oder SOAP-Fehler enthalten. Eine Erfolgsantwort ist immer eine SOAP-Nachricht. Weitere Informationen finden Sie unter Struktur der SOAP-Antwortnachricht.
Bei einem HTTP-Fehler kann der mögliche Fehler den folgenden HTTP-Fehlercode enthalten: "400 Bad request (e.g. invalid header format)".
Nachdem eine Anforderung in der HTTP-Protokollschicht erfolgreich war, wird sie jedoch von der SOAP-Sprachpipe verarbeitet. Auf diese Weise werden keine Fehlerantworten auf HTTP-Ebene generiert. Nachdem die Sprachpipe mit der Verarbeitung einer Anforderung begonnen hat, können als Fehler nur noch SOAP-Fehler generiert werden.
Wenn SOAP-Fehler generiert werden, werden diese als HTTP 500-Fehler zurückgegeben. Die Fehler werden unter folgenden Umständen beim Analysieren des SOAP-Umschlags generiert, der in der Anforderung enthalten ist:
Der SOAP-Umschlag ist ungültig, z. B. Fehler beim Analysieren, fehlende Elemente usw.
Während der Analyse sind Bedingungen des Typs "Nicht genügend Arbeitsspeicher" aufgetreten.
SQL Server-Anmeldefehler.
Nicht unterstützte SOAP-Operation, z. B. wurde eine gespeicherte Prozedur nicht gefunden oder eine unbekannte Operation angegeben.
Andere Fehler, die aus der Ausführung einer gespeicherten Prozedur oder benutzerdefinierten Funktion in der Anforderung übergeben und konvertiert werden, z. B., wenn die Anzahl der angegebenen Parameter nicht gültig war.
In der Struktur einer SOAP-Fehlerantwort stellen die <faultcode>- und <detail>-Elemente spezifische zusätzliche Informationen zum Fehler bereit. Das <faultcode>-Element ist konsistent mit den SOAP 1.1- und SOAP 1.2-Fehlercodespezifikationen. Das <detail>-Element enthält jedoch eine Änderung, die nicht in den SOAP-Spezifikationen enthalten ist. Es stellt die gleichen ausführlichen Informationen zu SOAP-Fehlern für SOAP 1.2- und SOAP 1.1-Clients bereit, indem die gesamte SOAP 1.2-Fehlerstruktur in den <Detail>-Knoten eines SOAP 1.1-Fehlers eingebettet wird.
Alle SOAP-Fehler fallen in eine der folgenden vier Kategorien:
Ausführliche SOAP-Fehlercodeinformationen werden bereitgestellt, jedoch keine SQL Server-Fehlermeldungen.
Wenn dieses Verhalten auftritt, wird das SOAP-Ergebnis einem entsprechenden SOAP-Fehler zugeordnet.
Ausführliche SOAP-Fehlercodeinformationen werden mit einer ausführlicheren SQL Server-Fehlermeldung im Detailknoten bereitgestellt.
Einige SQL Server-Fehlermeldungen werden ausdrücklich verarbeitet und entsprechenden SOAP-Fehlern zugeordnet.
Der SOAP-Fehlercode 'unknown SQL error' wurde mit einer ausführlicheren SQL Server-Fehlermeldung im <detail>-Knoten zurückgegeben.
Wenn dieses Verhalten auftritt, wurde ein SQL-Fehler durch den Programmcode ausgelöst, dem kein bestimmter SOAP-Fehler zugeordnet ist.
Der SOAP-Fehlercode 'unknown SQL error' wurde ohne SQL Server-Fehlermeldungen zurückgegeben.
Wenn dieses Verhalten auftritt, wurde ein unbekanntes Ergebnis zurückgegeben, das dem SOAP-Fehler 'unknown SQL error' zugeordnet wurde.
Beispiel für einen SOAP 1.1-Fehler
<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>
Beispiel für einen SOAP 1.2-Fehler
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>
Beispiele
Standardmäßig stellt SQL Server SOAP 1.2-Fehlerinformationen bereit. Dies schließt zusätzliche Fehlerinformationen ein, die das SOAP 1.1-Fehlerformat nicht unterstützt. Aus diesem Grund werden einige zusätzliche, auf SOAP 1.2 bezogene Fehlerdetails als Überlauf in den <Detail>-Knoten von SOAP 1.1 eingebettet; dort können sie analysiert und durch SOAP 1.1-Clientanwendungen abgerufen werden.
Die folgenden Beispielcodezeilen zeigen eine mögliche Methode zum Analysieren und Abrufen dieser SOAP 1.2-Fehlerinformationen aus einem SOAP 1.1-Fehler, der von SQL Server zurückgegeben wurde. Der Code aus diesem Beispiel ist als Teil einer C#-Konsolenanwendung gedacht.
So integrieren Sie Analyse und Abruf von SOAP 1.2-Fehlerdetails in eine SOAP 1.1-Anwendung, die in C# geschrieben wurde
Kopieren Sie den folgenden Codeblock in eine vorhandene Funktion in der C#-Konsolenanwendung, die als Client für die SOAP 1.1-Version fungieren soll.
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); }
Ersetzen Sie den Inhalt des try { ... }-Blocks durch Code, der zum Senden einer SOAP 1.1-Anforderungsnachricht an SQL Server verwendet wird. Wenn dies erforderlich sein sollte, können Sie auch die Console.WriteLine()-Methodenaufrufe durch den Aufruf einer Methode ersetzen, die für die Ausnahmeverarbeitung in Ihrer Anwendung geeignet ist.