다음을 통해 공유


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 오류 세부 정보의 구문 분석 및 검색 기능을 통합하려면

  1. 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);
    }
    
  2. try { ... } 블록의 내용을 SQL Server에 SOAP 1.1 요청 메시지를 보내는 데 사용되는 코드로 바꿉니다. 필요에 따라 Console.WriteLine() 메서드 호출을 응용 프로그램의 예외 처리에 적합한 메서드 호출로 바꿀 수도 있습니다.