FaultContractAttribute Sınıf
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Bir hizmet işlemi işleme hatalarıyla karşılaştığında döndürülen bir veya daha fazla SOAP hatası belirtir.
public ref class FaultContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=true, Inherited=false)]
public sealed class FaultContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=true, Inherited=false)>]
type FaultContractAttribute = class
inherit Attribute
Public NotInheritable Class FaultContractAttribute
Inherits Attribute
- Devralma
- Öznitelikler
Örnekler
Aşağıdaki kod örneği, FaultContractAttribute işleminin, SampleMethod ayrıntı türüyle bir SOAP hatası döndürebileceğini belirtmek için GreetingFault kullanımını gösterir.
using System;
using System.Collections.Generic;
using System.Net.Security;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(Namespace="http://microsoft.wcf.documentation")]
public interface ISampleService{
[OperationContract]
[FaultContractAttribute(
typeof(GreetingFault),
Action="http://www.contoso.com/GreetingFault",
ProtectionLevel=ProtectionLevel.EncryptAndSign
)]
string SampleMethod(string msg);
}
[DataContractAttribute]
public class GreetingFault
{
private string report;
public GreetingFault(string message)
{
this.report = message;
}
[DataMemberAttribute]
public string Message
{
get { return this.report; }
set { this.report = value; }
}
}
class SampleService : ISampleService
{
#region ISampleService Members
public string SampleMethod(string msg)
{
Console.WriteLine("Client said: " + msg);
// Generate intermittent error behavior.
Random rnd = new Random(DateTime.Now.Millisecond);
int test = rnd.Next(5);
if (test % 2 != 0)
return "The service greets you: " + msg;
else
throw new FaultException<GreetingFault>(new GreetingFault("A Greeting error occurred. You said: " + msg));
}
#endregion
}
}
Imports System.Collections.Generic
Imports System.Net.Security
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.Text
Namespace Microsoft.WCF.Documentation
<ServiceContract(Namespace:="http://microsoft.wcf.documentation")> _
Public Interface ISampleService
<OperationContract, FaultContractAttribute(GetType(GreetingFault), Action:="http://www.contoso.com/GreetingFault", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
Function SampleMethod(ByVal msg As String) As String
End Interface
<DataContractAttribute> _
Public Class GreetingFault
Private report As String
Public Sub New(ByVal message As String)
Me.report = message
End Sub
<DataMemberAttribute> _
Public Property Message() As String
Get
Return Me.report
End Get
Set(ByVal value As String)
Me.report = value
End Set
End Property
End Class
Friend Class SampleService
Implements ISampleService
#Region "ISampleService Members"
Public Function SampleMethod(ByVal msg As String) As String Implements ISampleService.SampleMethod
Console.WriteLine("Client said: " & msg)
' Generate intermittent error behavior.
Dim rand As New Random(DateTime.Now.Millisecond)
Dim test As Integer = rand.Next(5)
If test Mod 2 <> 0 Then
Return "The service greets you: " & msg
Else
Throw New FaultException(Of GreetingFault)(New GreetingFault("A Greeting error occurred. You said: " & msg))
End If
End Function
#End Region
End Class
End Namespace
Aşağıdaki kod örneği, wcf istemcilerinin ISampleService türü GreetingFaultolarak FaultException<TDetail> bu SOAP hatasıyla karşılaştığını gösterir.
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using Microsoft.WCF.Documentation;
public class Client
{
public static void Main()
{
// Picks up configuration from the config file.
SampleServiceClient wcfClient = new SampleServiceClient();
try
{
// Making calls.
Console.WriteLine("Enter the greeting to send: ");
string greeting = Console.ReadLine();
Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));
Console.WriteLine("Press ENTER to exit:");
Console.ReadLine();
// Done with service.
wcfClient.Close();
Console.WriteLine("Done!");
}
catch (TimeoutException timeProblem)
{
Console.WriteLine("The service operation timed out. " + timeProblem.Message);
Console.ReadLine();
wcfClient.Abort();
}
catch (FaultException<GreetingFault> greetingFault)
{
Console.WriteLine(greetingFault.Detail.Message);
Console.ReadLine();
wcfClient.Abort();
}
catch (FaultException unknownFault)
{
Console.WriteLine("An unknown exception was received. " + unknownFault.Message);
Console.ReadLine();
wcfClient.Abort();
}
catch (CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message + commProblem.StackTrace);
Console.ReadLine();
wcfClient.Abort();
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports Microsoft.WCF.Documentation
Public Class Client
Public Shared Sub Main()
' Picks up configuration from the config file.
Dim wcfClient As New SampleServiceClient()
Try
' Making calls.
Console.WriteLine("Enter the greeting to send: ")
Dim greeting As String = Console.ReadLine()
Console.WriteLine("The service responded: " & wcfClient.SampleMethod(greeting))
Console.WriteLine("Press ENTER to exit:")
Console.ReadLine()
' Done with service.
wcfClient.Close()
Console.WriteLine("Done!")
Catch timeProblem As TimeoutException
Console.WriteLine("The service operation timed out. " & timeProblem.Message)
Console.ReadLine()
wcfClient.Abort()
Catch greetingFault As FaultException(Of GreetingFault)
Console.WriteLine(greetingFault.Detail.Message)
Console.ReadLine()
wcfClient.Abort()
Catch unknownFault As FaultException
Console.WriteLine("An unknown exception was received. " & unknownFault.Message)
Console.ReadLine()
wcfClient.Abort()
Catch commProblem As CommunicationException
Console.WriteLine("There was a communication problem. " & commProblem.Message + commProblem.StackTrace)
Console.ReadLine()
wcfClient.Abort()
End Try
End Sub
End Class
Açıklamalar
Hizmet işleminin FaultContractAttribute Web Hizmeti Açıklama Dili(WSDL) açıklamasına eklenen bir veya daha fazla özel özel durum koşulunu işlem tarafından döndürülen açık SOAP hata iletileri olarak bildirmek için özniteliğiyle bir işlemi işaretleyin.
Tüm yönetilen uygulamalarda işleme hataları nesneler tarafından Exception temsil edilir. Windows Communication Foundation (WCF) uygulamaları gibi SOAP tabanlı uygulamalarda hizmet yöntemleri, SOAP hata iletilerini kullanarak işleme hata bilgilerini iletir. WCF uygulamaları her iki tür hata sistemi altında yürütüldüğünden, istemciye gönderilmesi gereken tüm yönetilen özel durum bilgileri özel durumlardan SOAP hatalarına dönüştürülmelidir. Varsayılan hizmet özel durum davranışlarını kullanabilir veya özel durumların hata iletilerine eşlenip eşlenmediğini ve nasıl eşlenebileceğini açıkça denetleyebilirsiniz. WCF uygulamalarında özel durumlara ve SOAP hatalarına genel bakış için bkz. Sözleşmelerde ve Hizmetlerde Hataları Belirtme ve İşleme.
Hizmet işlemlerinin, istemcinin bir işlemin normal seyrinde almayı bekleyebileceği tüm SOAP hatalarını resmi olarak belirtmek için uygulamasını kullanması FaultContractAttribute önerilir. Ayrıca, bilgilerin açığa çıkmasını en aza indirmek için yalnızca istemcinin bilmesi gereken bilgilerin SOAP hatasında döndürülmüş olması önerilir.
özelliği hata Action iletisinin eylemini denetler.
özelliği, DetailType hata iletisinde seri hale getirilmiş ayrıntı nesnesinin türünü alır.
Name ve Namespace özellikleri, sırasıyla hata iletisinin adını ve ad alanını denetler.
, HasProtectionLevel hata iletisinin belirtilen bir koruma düzeyine sahip olup olmadığını gösterir ve belirtilmişse, ProtectionLevel özellik bu koruma düzeyini denetler.
Dikkat
Hata iletisi hassas bilgiler taşıyorsa veya güvenlik sorunlarına yol açabilirse, özelliğin ProtectionLevel ayarlanması kesinlikle önerilir.
öğesini açıkça ProtectionLevel.Sign veya ProtectionLevel.EncryptAndSignolarak ayarlarsanızProtectionLevel, bağlamada özelliğini kullanarak System.ServiceModel.SecurityMode güvenliği etkinleştirilmiş bir bağlama kullanmanız gerekir; aksi takdirde bir özel durum oluşturulur.
Güvenliği sağlayan bir bağlama seçerseniz ve özelliği sözleşmenin ProtectionLevel herhangi bir yerinde ayarlamazsanız, tüm uygulama verileri şifrelenir ve imzalanır.
Güvenliği etkin olmayan bir bağlama seçerseniz (örneğin, System.ServiceModel.BasicHttpBinding varsayılan olarak güvenlik devre dışıdır) ve ProtectionLevel açıkça ayarlanmadıysa, uygulama verilerinin hiçbiri korunmaz.
Birçok senaryo için hata iletileri için ayarı ProtectionLevelEncryptAndSign yeterlidir. Daha fazla ayrıntı için bkz. Koruma Düzeyini Anlama.
ile FaultContractAttributeişaretlenmiş bir işlemden belirtilen bir hatayı döndürmek için, işlem sırasında yönetilen özel durum oluştuğunda bir FaultException<TDetail> (tür parametresi serileştirilebilir hata bilgileridir) oluşturur. WCF istemci uygulamaları SOAP hatasını istemci uygulamasındakiyle aynı türle (yani FaultException<TDetail> tür parametresi serileştirilebilir hata bilgileridir) olarak ortaya çıkar. yalnızca FaultContractAttribute iki yönlü hizmet işlemleri ve zaman uyumsuz işlem çiftleri için SOAP hatalarını belirtmek için kullanılabilir; tek yönlü işlemler SOAP hatalarını desteklemez ve bu nedenle öğesini desteklemez FaultContractAttribute.
Uyarı
Hata bilgilerini iletmek için herhangi bir serileştirilebilir türü kullanabilirsiniz. WCF'nin bu sürümündeki tek kısıtlama, içinde FaultContractAttribute belirtilen türlerin tarafından System.Runtime.Serialization.DataContractSerializerserileştirilebilir olması gerektiğidir. Sağladığı serileştirme desteği için DataContractSerializer bkz. Veri Sözleşmesi Seri Hale Getiricisi.
Örneğin, istemcilerin içeren bir SOAP hatası Int32bekleyebileceğini belirtmek için, bu tür parametresini FaultContractAttribute hizmet yönteminize yerleştirin.
Uyarı
Aşağıdaki kod örnekleri , Nameveya Namespace özelliklerini ayarlamazProtectionLevel.
[OperationContractAttribute]
[FaultContractAttribute(typeof(int))]
int Divide(int arg1, int arg2);
<OperationContractAttribute(), FaultContractAttribute(GetType(Integer))> _
Function Divide(ByVal arg1 As Integer, ByVal arg2 As Integer) As Integer
End Interface 'FCADemonstration
Ardından, hizmet yönteminizde type parametresinin hata bilgilerini içeren tür olduğu yeni FaultException<TDetail> bir değer oluşturun (yukarıdaki örnekte, a Int32). Örneğin:
throw new FaultException<int>(4);
Throw New FaultException(Of Integer)(4)
Yukarıdaki örnek çok temeldir; neredeyse tüm bilgiler bir System.Int32 kod kullanılarak geçirilebilir, bu nedenle bu ayrıntı türü en kullanışlı değildir. WCF uygulamaları genellikle istemcinin hata bilgileri gereksinimlerine özgü ayrıntı türlerine sahip SOAP hatalarını belirtir. Daha eksiksiz bir örnek için Örnek bölümüne bakın.
Uyarı
tür parametresinin bir System.Stringolduğu bir yer belirtirsenizFaultException<TDetail>, dize değeri istemci uygulamasında detail özelliğine atanır; istemciler yöntemini çağırarak bu dizeyi FaultException<TDetail>.ToString alamaz. İstemci uygulaması çağırdığında Exception.ToStringdize değerinin döndürülmüş olması için, işlemin içine bir System.ServiceModel.FaultException özel durum oluşturun ve dizeyi oluşturucuya geçirin.
Bir özel durum oluştuğunda veya FaultException<TDetail> oluşturulduğunda uygulamanın davranışını açıkça denetlemek için arabirimini bir System.ServiceModel.Description.IContractBehaviorSystem.ServiceModel.Description.IServiceBehaviorüzerinde uygulayın System.ServiceModel.Dispatcher.IErrorHandler veya System.ServiceModel.Description.IEndpointBehavior özelliğine atayınChannelDispatcher.ErrorHandlers. IErrorHandler , oluşturulan SOAP hatasını ve istemciye geri gönderilip gönderilmeymeyeceğini açıkça denetlemenize olanak tanır.
Hata ayıklamayı kolaylaştırmak için öğesini kod içinde olarak ayarlayın ServiceBehaviorAttribute.IncludeExceptionDetailInFaultstrue veya uygulamasını bir uygulama yapılandırma dosyasında kullanabilirsiniz ServiceDebugBehavior.IncludeExceptionDetailInFaults . Etkinleştirildiğinde, hizmet çağırana otomatik olarak özel durum bilgilerini döndürür. Bu hatalar istemciye özel durumlar olarak FaultException görünür.
Önemli
Yönetilen özel durumlar iç uygulama bilgilerini açığa çıkarabileceğinden, ServiceBehaviorAttribute.IncludeExceptionDetailInFaults veya ServiceDebugBehavior.IncludeExceptionDetailInFaults öğelerinin true olarak ayarlanması, WCF istemcilerinin iç hizmet işlemi özel durumları hakkında, kişisel veya diğer hassas bilgiler de dahil olmak üzere, bilgi edinmesine izin verebilir.
Bu nedenle, ServiceBehaviorAttribute.IncludeExceptionDetailInFaults veya ServiceDebugBehavior.IncludeExceptionDetailInFaults değerini true olarak ayarlamak, yalnızca bir hizmet uygulamasında geçici olarak hata ayıklama yöntemi olarak önerilir. Ayrıca, bu şekilde ele alınmayan yönetilen istisnaları döndüren bir yöntemin WSDL'sinde, türü FaultException<TDetail> olan String için sözleşme bulunmaz. İstemciler, hata ayıklama bilgilerini düzgün bir şekilde almak için bilinmeyen bir SOAP hatası (WCF istemcilerine nesne olarak System.ServiceModel.FaultException döndürülür) olasılığını beklemelidir.
Oluşturucular
| Name | Description |
|---|---|
| FaultContractAttribute(Type) |
FaultContractAttribute sınıfının yeni bir örneğini başlatır. |
Özellikler
| Name | Description |
|---|---|
| Action |
İşlem sözleşmesinin bir parçası olarak belirtilen SOAP hata iletisinin eylemini alır veya ayarlar. |
| DetailType |
Hata bilgilerini içeren serileştirilebilir bir nesnenin türünü alır. |
| HasProtectionLevel |
SOAP hata iletisinin atanmış bir koruma düzeyi olup olmadığını gösteren bir değer alır. |
| Name |
Web Hizmetleri Açıklama Dili'nde (WSDL) hata iletisinin adını alır veya ayarlar. |
| Namespace |
SOAP hatasının ad alanını alır veya ayarlar. |
| ProtectionLevel |
SOAP hatasının bağlama gerektirdiği koruma düzeyini belirtir. |
| TypeId |
Türetilmiş bir sınıfta uygulandığında, bu Attributeiçin benzersiz bir tanımlayıcı alır. (Devralındığı yer: Attribute) |
Yöntemler
| Name | Description |
|---|---|
| Equals(Object) |
Bu örneğin belirtilen bir nesneye eşit olup olmadığını gösteren bir değer döndürür. (Devralındığı yer: Attribute) |
| GetHashCode() |
Bu örneğin karma kodunu döndürür. (Devralındığı yer: Attribute) |
| GetType() |
Geçerli örneğin Type alır. (Devralındığı yer: Object) |
| IsDefaultAttribute() |
Türetilmiş bir sınıfta geçersiz kılındığında, bu örneğin değerinin türetilmiş sınıf için varsayılan değer olup olmadığını gösterir. (Devralındığı yer: Attribute) |
| Match(Object) |
Türetilmiş bir sınıfta geçersiz kılındığında, bu örneğin belirtilen bir nesneye eşit olup olmadığını gösteren bir değer döndürür. (Devralındığı yer: Attribute) |
| MemberwiseClone() |
Geçerli Objectbasit bir kopyasını oluşturur. (Devralındığı yer: Object) |
| ToString() |
Geçerli nesneyi temsil eden bir dize döndürür. (Devralındığı yer: Object) |
Belirtik Arabirim Kullanımları
| Name | Description |
|---|---|
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Bir ad kümesini karşılık gelen bir dağıtma tanımlayıcısı kümesine eşler. (Devralındığı yer: Attribute) |
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Bir arabirimin tür bilgilerini almak için kullanılabilecek bir nesnenin tür bilgilerini alır. (Devralındığı yer: Attribute) |
| _Attribute.GetTypeInfoCount(UInt32) |
Bir nesnenin sağladığı tür bilgisi arabirimlerinin sayısını alır (0 ya da 1). (Devralındığı yer: Attribute) |
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Bir nesne tarafından kullanıma sunulan özelliklere ve yöntemlere erişim sağlar. (Devralındığı yer: Attribute) |