Aracılığıyla paylaş


soap hatası iletisi yapısı

Bu özellik Microsoft SQL Server'ın ilerideki bir sürümünde kaldırılacaktır. Yeni geliştirme işlerinde bu özelliği kullanmaktan kaçının ve bu özelliği kullanmakta olan uygulamalarda değişiklik yapmayı planlayın.

soap isteği yanıtı iki formdan birini alabilir: yanıtları başarı 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ı 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 http - oluşturmazdüzey hata yanıtları.Dil kanal bir isteği işlemeye başladıktan sonra onu üretmek tek soap hatalarının hatalardır.

soap hatalarının oluşturulduğunda, bunlar http 500 hataları olarak döndürülür.Hatalar, istekte bulunan soap zarfını Ayrıştırma sırasında 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şlem, saklı yordam bulunamadı veya belirtilen Bilinmeyen işlem gibi.

  • Geçtiğini ve yürütülmesini dönüştürülen diğer hatalar bir saklı yordam veya istekte belirtilen parametre sayısı gibi kullanıcı tanımlı işlev geçerli değil.

soap arıza yanıtı yapısı içinde <faultcode> ve <ayrıntı> öğeleri sağlayan belirli ek bilgi hata.The <faultcode> element is consistent with the SOAP 1.1 and SOAP 1.2 fault code specifications.Ancak, <ayrıntı> öğesi içeren bir değişiklik dışında soap belirtimleri.Onu aynı hakkında ayrıntılı bilgiler soap hatalarının soap 1.2 hem soap 1.1 istemciler için tam soap 1.2 arıza yapısında gömerek sağlar <ayrıntı> düğüm soap 1.1 hatası.

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

  • Sağlanan ayrıntılı soap arıza kodu bilgileri, ancak hiçbir sql Server hata iletileri.

    Bu davranış oluştuğunda, soap sonucu uygun olan bir soap hatası eşleştirir.

  • Ayrıntı düğümünde daha ayrıntılı sql Server hata iletisi ile sağlanan ayrıntılı soap arıza kodu.

    Bazı SQL Server hata iletileri açıkça işlenen ve eşlenmiş uygun soap hatası.

  • ' Bilinmeyen sql hata ' soap arıza kodu döndü, bir daha ayrıntılı sql Server hata iletisi ile birlikte <ayrıntı> düğüm.

    Bu davranış oluştuğunda, sql hata gelen yerde kod, sürüldü, ancak belirli bir soap hatası için özel eşleme yok var.

  • ' Bilinmeyen sql hata ' soap arıza kodu ile hiçbir sql Server hata iletisi döndürdü.

    Bu davranış ortaya çıktığında, bilinmeyen bir sonuç yerde döndü ve 'Bilinmeyen sql hata' eşleştirilmiş Bir soap hatası.

Ö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 hazırlar soap 1.2 arıza bilgileri.Bu, soap 1.1 hatası biçimini destekleyen ek hata bilgilerini içerir.Bu nedenle, bazı ek soap 1.2 hata ayrıntıları taşma gömülü soap 1.1 ilgili <Ayrıntıları> düğüm, burada bulunabilir ayrıştırıldı ve alınan soap 1.1 istemci uygulamaları.

Aşağıdaki örnek kod satırlarını bir olası yöntem tarafından döndürülen bir soap 1.1 hatası bu soap 1.2 arıza bilgilerinden Çıkış ayrıştırma göstermek SQL Server.Onu anlamına gelir gibi bu kodu bir C# konsol uygulamasının bir parçası olarak kullanılmak üzere tasarlanmıştır.

C# ile yazılmış soap 1.1 uygulamanıza ayrıştırma ve soap 1.2 hata ayrıntıları alınmasını bütünleştirmek için

  1. Varolan bir için aşağıdaki kod bloğunu Kopyala işlev , C# konsol soap 1.1 sürüm istemcisi olarak davranmasına kullanılan uygulama.

    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. İçeriğini değiştirmek try { ... } blok bir soap 1.1 istek iletisi göndermek için kullanılan kod ile SQL Server.Varsa, siz de yerine Console.WriteLine() ne olursa olsun yöntemine bir çağrı ile yöntem çağrıları uygun özel durum işleme uygulaması.