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:
Hizmetinizin bir istemcisinin bilmesi gereken hata koşullarını tanımlayın.
Bu hata koşulları için SOAP hatalarının özel içeriğini tanımlayın.
İş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, MathFault
dahil olmak üzere Divide
tü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 MathFault
bir 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 MathFault
dö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
, Code
ve Reason
bir 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.
- FaultContractAttribute
- DataContractAttribute
- DataMemberAttribute
- Sözleşme ve Hizmetlerde Hataları Belirtme ve İşleme
- Hataları Gönderme ve Alma
- Nasıl yapılır: Hizmet Sözleşmelerinde Hata Bildirme
- Koruma Düzeylerini Anlama
- Nasıl yapılır: ProtectionLevel Özelliğini Ayarlama
- Hizmet Anlaşmalarında Veri Aktarımını Belirtme