Aracılığıyla paylaş


SOAP hatası iletisi yapısı

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.

SOAP istekleri için yanıtı iki formlarından birini alabilir: Başarılı yanıt veya hata yanıtlarını. Bir hata yanıt için yanıt, HTTP hataları ya da SOAP hatalarının içerebilir.Başarılı bir yanıt her zaman bir SOAP iletisidir.Daha fazla bilgi için bkz:SOAP yanıtı iletisi yapısı.

Bir HTTP hatası için olası hata aşağıdaki HTTP hata kodu içerebilir: "400 Bad request (e.g.invalid header format)."

Ancak, bir istek HTTP protokol katmanında başarılı oldu sonra SOAP dil kanal tarafından işlenir.Bu hata yanıtlarına HTTP düzey oluşturmaz.Dil kanal bir isteği işlemeye başladıktan sonra yalnızca hataları oluşturabilir, SOAP hatalarıdır.

SOAP hatalarının oluşturulduğunda, HTTP 500 hataları olarak döndürülür.Hatalar, istekte bulunan SOAP zarfını ayrıştırılırken aşağıdaki durumlarda oluşturulur:

  • SOAP zarfını ayrıştırma hatası, eksik öğeleri vb. gibi geçerli değil.

  • Ayrıştırma sırasında koşullar bellek yetersiz.

  • SQL Server oturum açma hatası.

  • Desteklenmeyen SOAP işlemi, saklı yordam bulunamadı ya da bilinmeyen işlem belirtildi.

  • Diğer hataları, uygulama geçtiğini ve gelen bir saklı yordam veya kullanıcı tanımlı fonksiyonu, istekteki yürütme gibi belirtilen parametre sayısı geçersiz dönüştürülür.

Bir SOAP hatası yanıt yapısında <faultcode> ve <Ayrıntı> öğeleri belirli, hata hakkında ek bilgi sağlar. The <faultcode> element is consistent with the SOAP 1.1 and SOAP 1.2 fault code specifications.Ancak, <Ayrıntı> öğe SOAP belirtimleri dışında bir değişiklik içerir. Tam SOAP 1.2 hataya yapısında katıştırma tarafından SOAP 1.2 hem de SOAP 1.1 istemcilerine SOAP hatalarının ayrıntılı aynı bilgi sağladığı <Ayrıntı> düğüm, bir SOAP 1.1 hatası.

Tüm SOAP hatalarının aşağıdaki dört durumlardan birine aittir:

  • Sağlanan ayrıntılı SOAP hata kodu bilgileri, ancak yok bir SQL Server hata iletileri.

    Bu davranış oluştuğunda, SOAP sonucu için uygun bir SOAP hatası eşleştirir.

  • Sağlanan ayrıntı düğümünde ayrıntılı SQL Server hata iletisiyle ayrıntılı SOAP arıza kodu.

    Bazı SQL Server hata iletileri açıkça işlenen ve için uygun bir SOAP hatalarının eşleştirilmiş.

  • ' Bilinmeyen SQL hata ' SOAP hata kodu ile birlikte ayrıntılı bir SQL Server hata iletisinde döndürüldü <Ayrıntı> düğüm.

    Bu davranış oluştuğunda, SQL hata gelen herhangi bir yeri kodu yükseltilmiş, ancak belirli bir SOAP hatası için herhangi bir özel eşlemesi yok.

  • ' Bilinmeyen SQL hata ' SOAP arıza kodu yok SQL Server hata iletileri ile döndürüldü.

    Bu davranış oluştuğunda, bilinmeyen bir sonuç yerde döndürdü ve SOAP 'Bilinmeyen SQL hatası' hata için eşleştirilmiş.

Örnek SOAP 1.1 hatası

<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>

Örnek SOAP 1,2 hatası

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>

Örnekler

Varsayılan olarak, SQL Server SOAP 1.2 hata bilgileri hazırlar. Bu hataya SOAP 1.1 biçimini desteklemiyor, ek hata bilgilerini içerir.Bu nedenle, bazı ek SOAP 1.2 hata ayrıntıları SOAP 1.1 taşma katıştırılır ilgili. <Ayrıntılar> düğüm, burada bunlar ayrıştırılır ve olması SOAP 1.1 istemci uygulamaları tarafından alınır.

Aşağıdaki kod örneği satırlarını bu SOAP 1.2 hata bilgileri döndürdüğü bir SOAP 1.1 hataya karşı ayrıştırılırken bir olası yöntem gösterilmektedir. SQL Server. Metni gibi bu kod, C# konsol uygulaması bir parçası olarak kullanılmak üzere tasarlanmıştır.

C# dilinde yazılmış SOAP 1.1 uygulamanıza ayrıştırma ve SOAP 1.2 hata ayrıntıları alınmasını tümleştirmek için

  1. Aşağıdaki kodu kopyalayın blok varolan bir işlevi, C# için SOAP 1.1 sürüm istemci olarak çalışmak için kullanılan uygulama konsol.

    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. Içeriğini değiştirmek try { ... } SOAP 1.1 isteği ileti göndermek için kullanılan kodu engelle SQL Server. Varsa, ayrıca, değiştirebilirsiniz Console.WriteLine() yöntem çağrıları içeren bir arama için hangi yöntemi kullanırsanız, uygulamanızı işleme özel durum için uygundur.