SOAP 오류 메시지 구조
Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 응용 프로그램은 수정하십시오.
SOAP 요청 응답의 형태는 성공 응답과 오류 응답의 두 가지 중 하나입니다. 오류 응답의 경우 HTTP 오류나 SOAP 오류가 응답에 포함될 수 있습니다. 성공 응답은 항상 SOAP 메시지입니다. 자세한 내용은 SOAP 응답 메시지 구조를 참조하십시오.
HTTP 오류의 경우 "400 잘못된 요청(예: 잘못된 헤더 포맷)"이라는 내용의 HTTP 오류 코드가 오류에 포함될 수 있습니다.
그러나 요청이 HTTP 프로토콜 계층에서 성공한 후에는 SOAP 언어 파이프에서 처리됩니다. 이때 HTTP 수준의 오류 응답이 생성되지 않습니다. 언어 파이프에서 요청을 처리하기 시작한 후 생성되는 오류는 SOAP 오류뿐입니다.
생성되는 SOAP 오류는 HTTP 500 오류로 반환됩니다. 다음과 같은 경우 요청에 포함된 SOAP Envelope를 구문 분석하는 동안 오류가 생성됩니다.
구문 분석 오류, 누락된 요소 등 SOAP Envelope가 유효하지 않은 경우
구문 분석 중 메모리가 부족한 경우
SQL Server 로그인이 실패하는 경우
저장 프로시저를 찾을 수 없거나 알 수 없는 작업이 지정되어 있는 등 SOAP 작업이 지원되지 않는 경우
매개 변수 수를 잘못 지정했을 때와 같이 요청에 있는 사용자 정의 함수나 저장 프로시저의 실행을 통해 전달되고 변환되는 기타 오류
SOAP 오류 응답 구조에서 <faultcode> 요소와 <detail> 요소는 오류에 대한 특정 정보를 추가로 제공합니다. <faultcode> 요소는 SOAP 1.1 및 SOAP 1.2 오류 코드 사양과 일치합니다. 그러나 <detail> 요소에는 SOAP 사양과 관련 없는 수정 내용이 있습니다. 이 요소는 SOAP 1.1 오류의 <detail> 노드에 전체 SOAP 1.2 오류 구조를 포함하여 SOAP 1.2 및 SOAP 1.1 클라이언트에 모두 SOAP 오류에 대한 동일한 정보를 자세히 제공합니다.
모든 SOAP 오류는 다음 4가지 경우 중 하나에 속합니다.
자세한 SOAP 오류 코드 정보가 제공되지만 SQL Server 오류 메시지는 없는 경우
이러한 동작이 발생하면 SOAP 결과가 해당 SOAP 오류로 매핑됩니다.
자세한 SOAP 오류 코드가 제공되며 detail 노드에 보다 자세한 SQL Server 오류 메시지가 표시되는 경우
일부 SQL Server 오류 메시지가 명시적으로 처리되고 해당 SOAP 오류에 매핑됩니다.
'알 수 없는 SQL 오류'라는 내용의 SOAP 오류 코드가 반환되며 <detail> 노드에 보다 자세한 SQL Server 오류 메시지가 표시되는 경우
이러한 동작이 발생하면 코드 어딘가에 SQL 오류가 발생했지만 특정 SOAP 오류에 대한 특수 매핑은 없는 것입니다.
'알 수 없는 SQL 오류'라는 내용의 SOAP 오류 코드가 반환되며 SQL Server 오류 메시지는 없는 경우
이러한 동작이 발생하면 어디선가 알 수 없는 결과가 반환되었으며 '알 수 없는 SQL 오류'라는 내용의 SOAP 오류에 이 결과가 매핑된 것입니다.
예제 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>
예제 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>
예
기본적으로 SQL Server는 SOAP 1.2 오류 정보를 준비합니다. 여기에는 SOAP 1.1 오류 형식에서 지원하지 않는 추가 오류 정보가 포함됩니다. 따라서 일부 추가 SOAP 1.2 관련 오류 세부 정보가 SOAP 1.1 <Details> 노드에 오버플로로 포함됩니다. 이 노드에서 SOAP 1.1 클라이언트 응용 프로그램이 오류 세부 정보를 구문 분석하고 검색할 수 있습니다.
다음 예제 코드 줄에서는 SQL Server에서 반환된 SOAP 1.1 오류에서 이 SOAP 1.2 오류 정보를 구문 분석하는 방법을 보여 줍니다. C# 콘솔 응용 프로그램의 일부로 이 코드를 사용할 수 있습니다.
C#으로 작성된 SOAP 1.1 응용 프로그램에 SOAP 1.2 오류 세부 정보의 구문 분석 및 검색 기능을 통합하려면
SOAP 1.1 버전 클라이언트 역할을 하는 데 사용되는 C# 콘솔 응용 프로그램의 기존 함수에 다음 코드 블록을 복사해 넣습니다.
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); }
try { ... } 블록의 내용을 SQL Server에 SOAP 1.1 요청 메시지를 보내는 데 사용되는 코드로 바꿉니다. 필요에 따라 Console.WriteLine() 메서드 호출을 응용 프로그램의 예외 처리에 적합한 메서드 호출로 바꿀 수도 있습니다.