Struttura dei messaggi di errore SOAP
Questa caratteristica verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server. Evitare di utilizzare questa caratteristica in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.
Le risposte alle richieste SOAP possono indicare l'esito positivo della richiesta oppure un errore. Nel caso degli errori, la risposta può contenere errori HTTP o errori SOAP. L'esito positivo viene sempre segnalato da un messaggio SOAP. Per ulteriori informazioni, vedere Struttura del messaggio di risposta SOAP.
Un errore HTTP includerà probabilmente il codice di errore HTTP 400 - Richiesta non valida (ad esempio formato intestazione non valido).
Dopo che una richiesta ha avuto esito positivo al livello del protocollo HTTP, tuttavia, viene elaborata dalla pipe di linguaggio SOAP. Questo non genera errori a livello HTTP. Quando la pipe di linguaggio inizia l'elaborazione di una richiesta, può generare solo errori SOAP.
Quando vengono generati errori SOAP, vengono restituiti come errori HTTP 500. Gli errori vengono generati nei casi seguenti durante l'analisi della busta SOAP contenuta nella richiesta:
Busta SOAP non valida, ad esempio per un errore di analisi, mancanza di elementi e così via.
Condizioni di memoria insufficiente durante l'analisi.
Errori di accesso di SQL Server.
Operazione SOAP non supportata, ad esempio una stored procedure non trovata o la specifica di un'operazione sconosciuta.
Altri errori che vengono passati e convertiti dall'esecuzione di una stored procedure o di una funzione definita dall'utente nella richiesta, ad esempio numero di parametri specificati non valido.
Nella struttura di una risposta di errore SOAP, gli elementi <faultcode> e <detail> offrono ulteriori informazioni specifiche sull'errore. L'elemento <faultcode> è consistente con le specifiche relative ai codici di errore SOAP 1.1 e SOAP 1.2. L'elemento <detail> include invece una modifica esterna alle specifiche SOAP. Offre le stesse informazioni dettagliate sugli errori SOAP sia ai client SOAP 1.2 che ai client SOAP 1.1, incorporando l'intera struttura dell'errore SOAP 1.2 nel nodo <detail> di un errore SOAP 1.1.
Tutti gli errori SOAP rientrano in uno dei quattro casi seguenti:
Sono state fornite informazioni dettagliate sul codice di errore SOAP, ma non sono stati ricevuti messaggi di errore di SQL Server.
Quando si verifica questa situazione, il risultato SOAP è associato a un errore SOAP appropriato.
È stato fornito un codice di errore SOAP dettagliato, con un messaggio di errore di SQL Server più dettagliato nel nodo detail.
Alcuni messaggi di errore di SQL Server vengono gestiti in modo esplicito e associati agli errori SOAP appropriati.
È stato restituito un codice di errore SOAP corrispondente a un errore SQL sconosciuto, con un messaggio di errore di SQL Server più dettagliato nel nodo <detail>.
Quando si verifica questa situazione, in qualche punto del codice è stato generato un errore SQL, ma non esiste un'associazione a uno specifico errore SOAP.
È stato restituito un codice di errore SOAP corrispondente a un errore SQL sconosciuto senza messaggi di errore di SQL Server.
Quando si verifica questa situazione, in qualche punto è stato restituito un risultato sconosciuto che è stato associato all'errore SOAP corrispondente a un errore SQL sconosciuto.
Errore SOAP 1.1 di esempio
<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>
Errore SOAP 1.2 di esempio
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>
Esempi
Per impostazione predefinita, SQL Server prepara informazioni sugli errori SOAP 1.2, comprese alcune informazioni di errore aggiuntive non supportate dal formato degli errori SOAP 1.1. I dettagli aggiuntivi relativi ad alcuni errori SOAP 1.2 pertanto vengono incorporati come errori di overflow nel nodo SOAP 1.1 <Details>, in cui possono essere analizzati e recuperati da applicazioni client SOAP 1.1.
Le righe di codice di esempio seguenti illustrano un possibile metodo per l'analisi di queste informazioni di errore SOAP 1.2 da un errore SOAP 1.1 restituito da SQL Server. Il codice è inteso per l'utilizzo come parte di un'applicazione console C#.
Per integrare l'analisi e il recupero dei dettagli relativi agli errori SOAP 1.2 in un'applicazione SOAP 1.1 scritta in C#
Copiare il blocco di codice seguente in una funzione esistente dell'applicazione console C# utilizzata per fungere da client 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); }
Sostituire il contenuto del blocco try { ... } con il codice utilizzato per l'invio di un messaggio di richiesta SOAP 1.1 a SQL Server. Se necessario, è inoltre possibile sostituire le chiamate al metodo Console.WriteLine() con una chiamata al metodo appropriato per la gestione delle eccezioni nell'applicazione in uso.