Aracılığıyla paylaş


Hataları Tanımlama ve Belirtme

SOAP hataları, hata durumu bilgilerini bir hizmetten istemciye ve çift yönlü durumda, bir istemciden birlikte çalışabilen bir şekilde hizmete iletir. Bu konu başlığında özel hata içeriğinin ne zaman ve nasıl tanımlanacağı ve hangi işlemlerin bunları döndürebileceği açıklanmaktadır. Bir hizmetin veya çift yönlü istemcinin bu hataları nasıl gönderebileceği ve istemci veya hizmet uygulamasının bu hataları nasıl işlediği hakkında daha fazla bilgi için bkz . Gönderme ve Alma Hataları. Windows Communication Foundation (WCF) uygulamalarında hata işlemeye genel bakış için bkz . Sözleşmelerde ve Hizmetlerde Hataları Belirtme ve İşleme.

Genel bakış

Bildirilen SOAP hataları, bir işlemin özel SOAP hata türünü belirten bir System.ServiceModel.FaultContractAttribute işlemi olan hatalardır. Bildirilmemiş SOAP hataları, bir işlem için sözleşmede belirtilmeyen hatalardır. Bu konu, bu hata koşullarını belirlemenize ve özel SOAP hataları tarafından bildirildiğinde istemcilerin bu hata koşullarını düzgün bir şekilde işlemek için kullanabileceği bir hata sözleşmesi oluşturmanıza yardımcı olur. Temel görevler sırasıyla şunlardır:

  1. Hizmetinizin bir istemcisinin bilmesi gereken hata koşullarını tanımlayın.

  2. Bu hata koşulları için SOAP hatalarının özel içeriğini tanımlayın.

  3. İşlemlerinizi işaretle, bu hataların belirli SOAP hatalarının WSDL'deki istemcilere açık olmasını sağlayın.

İstemcilerin bilmesi gereken hata koşullarını tanımlama

SOAP hataları, belirli bir işlem için hata bilgilerini taşıyan genel olarak açıklanmıştır. Bunlar WSDL'deki diğer işlem iletileriyle birlikte açıklandığından, istemciler bir işlemi çağırırken bu tür hataların işlenmesini bilir ve bu nedenle bekler. Ancak WCF hizmetleri yönetilen kodda yazıldığından, yönetilen koddaki hangi hata koşullarının hataya dönüştürüleceğine ve istemciye döndürüleceğine karar vermek, hizmetinizdeki hata koşullarını ve hataları bir istemciyle yaptığınız resmi hata konuşmasından ayırma fırsatı sağlar.

Örneğin, aşağıdaki kod örneği iki tamsayı alan ve başka bir tamsayı döndüren bir işlemi gösterir. Burada çeşitli özel durumlar oluşturulabilir, bu nedenle hata sözleşmesini tasarlarken istemciniz için hangi hata koşullarının önemli olduğunu belirlemeniz gerekir. Bu durumda, hizmetin özel durumu algılaması System.DivideByZeroException gerekir.

[ServiceContract]  
public class CalculatorService  
{  
    [OperationContract]
    int Divide(int a, int b)  
    {  
      if (b==0) throw new Exception("Division by zero!");  
      return a/b;  
    }  
}  
<ServiceContract> _
Public Class CalculatorService
    <OperationContract> _
    Public Function Divide(a As Integer, b As Integer) As Integer
        If b = 0 Then Throw New DivideByZeroException("Division by zero!")
        Return a / b
    End Function
End Class

Yukarıdaki örnekte işlem, sıfıra bölmeye özgü özel bir SOAP hatası, matematik işlemlerine özgü olan ancak sıfıra bölmeye özgü bilgiler içeren özel bir soap hatası, birkaç farklı hata durumu için birden çok hata döndürebilir veya SOAP hatası döndüremez.

Hata Koşullarının İçeriğini Tanımlama

Özel soap hatasını yararlı bir şekilde döndürebilecek bir hata koşulu tanımlandığında, sonraki adım bu hatanın içeriğini tanımlamak ve içerik yapısının seri hale getirilebildiğinden emin olmaktır. Önceki bölümdeki kod örneğinde bir işleme özgü bir Divide hata gösterilmektedir, ancak hizmette Calculator başka işlemler varsa, tek bir özel SOAP hatası istemciye dahil olan tüm hesap makinesi hata koşullarını Divide bildirebilir. Aşağıdaki kod örneği, MathFaultdahil olmak üzere Dividetüm matematik işlemleri kullanılarak yapılan hataları bildirebilen özel bir SOAP hatasının oluşturulmasını gösterir. sınıfı bir işlem ( Operation özellik) ve sorunu ProblemType (özellik) açıklayan bir değer belirtebilirken, sınıfın ve bu özelliklerin istemciye özel SOAP hatasında aktarılabilmesi için serileştirilebilir olması gerekir. Bu nedenle, System.Runtime.Serialization.DataContractAttribute ve System.Runtime.Serialization.DataMemberAttribute öznitelikleri türü ve özelliklerini serileştirilebilir ve mümkün olduğunca birlikte çalışabilir hale getirmek için kullanılır.

// Define a math fault data contract
[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public class MathFault
{
    private string operation;
    private string problemType;

    [DataMember]
    public string Operation
    {
        get { return operation; }
        set { operation = value; }
    }

    [DataMember]
    public string ProblemType
    {
        get { return problemType; }
        set { problemType = value; }
    }
}
' Define a math fault data contract
<DataContract([Namespace]:="http://Microsoft.ServiceModel.Samples")> _
Public Class MathFault

    Private m_operation As String
    Private m_problemType As String

    <DataMember()> _
    Public Property Operation() As String

        Get

            Return m_operation

        End Get

        Set(ByVal value As String)

            m_operation = value

        End Set

    End Property

    <DataMember()> _
    Public Property ProblemType() As String

        Get

            Return m_problemType

        End Get

        Set(ByVal value As String)

            m_problemType = value

        End Set

    End Property

End Class

Verilerinizin seri hale getirilebilir olmasını sağlama hakkında daha fazla bilgi için bkz . Hizmet Sözleşmelerinde Veri AktarımıNı Belirtme. Sağlayan serileştirme desteğinin System.Runtime.Serialization.DataContractSerializer listesi için bkz . Veri Sözleşmesi Seri Hale Getiricisi Tarafından Desteklenen Türler.

Hata Sözleşmesini Oluşturmak için İşlemleri İşaretle

Özel SOAP hatasının bir parçası olarak döndürülen serileştirilebilir bir veri yapısı tanımlandığında, son adım işlem sözleşmenizi bu tür bir SOAP hatası oluşturacak şekilde işaretlemektir. Bunu yapmak için özniteliğini System.ServiceModel.FaultContractAttribute kullanın ve oluşturduğunuz özel veri türünün türünü geçirin. Aşağıdaki kod örneği, işlemin türünde MathFaultbir SOAP hatası döndürebileceğini belirtmek Divide için özniteliğinin nasıl kullanılacağını FaultContractAttribute gösterir. Diğer matematik tabanlı işlemler artık bir MathFaultdöndürebileceklerini de belirtebilir.

[OperationContract]
[FaultContract(typeof(MathFault))]
int Divide(int n1, int n2);
<OperationContract()> _
<FaultContract(GetType(MathFault))> _
Function Divide(ByVal n1 As Integer, ByVal n2 As Integer) As Integer

İşlem, işlemi birden fazla öznitelikle işaretleyerek birden fazla FaultContractAttribute özel hata döndüreceğini belirtebilir.

İşlem uygulamanızda hata sözleşmesini uygulamak için bir sonraki adım, Gönderme ve Alma Hataları konusunda açıklanmıştır.

SOAP, WSDL ve Birlikte Çalışabilirlik Konuları

Bazı durumlarda, özellikle diğer platformlarla birlikte çalışırken, soap iletisinde hatanın nasıl göründüğünü veya WSDL meta verilerinde nasıl tanımlandığı denetlenebilir.

özniteliği, FaultContractAttribute bu hatanın meta verilerinde oluşturulan WSDL hata öğesi adının denetimine izin veren bir Name özelliğe sahiptir.

SOAP standardına göre, bir hata Action, Codeve Reasonbir olabilir. Action özelliği tarafından denetlenmektedirAction. Code özelliği ve Reason özelliği, genel System.ServiceModel.FaultException<TDetail>sınıfının üst sınıfı olan sınıfının özellikleridirSystem.ServiceModel.FaultException. Code özelliği bir SubCode üye içerir.

Hata oluşturan hizmet dışı hizmetlere erişirken belirli sınırlamalar vardır. WCF yalnızca şemanın açıklayıp veri sözleşmeleriyle uyumlu ayrıntı türlerine sahip hataları destekler. Örneğin, yukarıda belirtildiği gibi WCF, ayrıntı türlerinde XML özniteliklerini kullanan hataları veya ayrıntı bölümünde birden fazla üst düzey öğeye sahip hataları desteklemez.

Ayrıca bkz.