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, işleminin ayrıntı türü GreetingFault
olan bir SOAP hatası döndürebileceğini belirtmek SampleMethod
için kullanımını FaultContractAttribute 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ü GreetingFault
olarak 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 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ı nesnelerle 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 yönetilen özel durum bilgilerinin özel durumlardan SOAP hatalarına dönüştürülmesi gerekir. Varsayılan hizmet özel durum davranışlarını kullanabilir veya özel durumların hata iletileriyle eşlenip eşlenmediğini (ve nasıl) 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, bir 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çabiliyorsa, özelliğin ProtectionLevel ayarlanması kesinlikle önerilir.
öğesini açıkça ProtectionLevel.Sign veya ProtectionLevel.EncryptAndSignolarak ayarlarsanızProtectionLevel, bağlamadaki ö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ı ProtectionLevel EncryptAndSign yeterlidir. Diğer ayrıntılar 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> (burada 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 parametresinin serileştirilebilir hata bilgileri olduğu) gösterir. 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 'yi desteklemez FaultContractAttribute.
Not
Hata bilgilerini iletmek için herhangi bir seri hale getirilebilir 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. 'nin sağladığı serileştirme desteği DataContractSerializer için bkz. Veri Sözleşmesi Seri Hale Getirici.
Örneğin, istemcilerin içeren bir SOAP hatası Int32bekleyebileceğini belirtmek için, bu tür parametresini FaultContractAttribute hizmet yönteminize yerleştirin.
Not
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 oluşturun (yukarıdaki örnekte, bir Int32). Örnek:
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ürleriyle SOAP hatalarını belirtir. Daha eksiksiz bir örnek için Örnek bölümüne bakın.
Not
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çinde bir System.ServiceModel.FaultException özel durum oluşturun ve dizeyi oluşturucuya geçirin.
Bir özel durum oluştuğunda veya FaultException<TDetail> oluştuğunda uygulamanın davranışını açıkça denetlemek için arabirimini System.ServiceModel.Dispatcher.IErrorHandler bir System.ServiceModel.Description.IServiceBehaviorSystem.ServiceModel.Description.IContractBehavior üzerinde uygulayın 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 denetlemenizi sağlar.
Hata ayıklamayı kolaylaştırmak için öğesini kodda olarak ayarlayın ServiceBehaviorAttribute.IncludeExceptionDetailInFaults true
veya bir uygulama yapılandırma dosyasında kullanabilirsiniz ServiceDebugBehavior.IncludeExceptionDetailInFaults . Etkinleştirildiğinde, hizmet çağırana otomatik olarak özel durum bilgileri 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, veya ayarı ServiceBehaviorAttribute.IncludeExceptionDetailInFaults ServiceDebugBehavior.IncludeExceptionDetailInFaults true
WCF istemcilerinin kişisel olarak tanımlanabilir bilgiler veya diğer hassas bilgiler de dahil olmak üzere iç hizmet işlemi özel durumları hakkında bilgi almasına izin verebilir.
Bu nedenle, veya ServiceDebugBehavior.IncludeExceptionDetailInFaults ayarı ServiceBehaviorAttribute.IncludeExceptionDetailInFaults true
yalnızca bir hizmet uygulamasında geçici olarak hata ayıklama yöntemi olarak önerilir. Ayrıca, bu şekilde işlenmeyen yönetilen özel durumlar döndüren bir yöntemin WSDL'i türü Stringiçin FaultException<TDetail> sözleşmeyi içermez. İstemciler, hata ayıklama bilgilerini düzgün bir şekilde elde etmek için bilinmeyen bir SOAP hatası (WCF istemcilerine nesne olarak System.ServiceModel.FaultException döndürülür) olasılığını beklemelidir.
Oluşturucular
FaultContractAttribute(Type) |
FaultContractAttribute sınıfının yeni bir örneğini başlatır. |
Özellikler
Action |
İşlem sözleşmesinin bir parçası olarak belirtilen SOAP hata iletisinin eylemini alır veya ayarlar. |
DetailType |
Hata bilgilerini içeren seri hale getirilebilir 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ğlamadan 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
Equals(Object) |
Bu örneğin belirtilen bir nesneye eşit olup olmadığını gösteren bir değeri döndürür. (Devralındığı yer: Attribute) |
GetHashCode() |
Bu örneğe ilişkin karma kodu döndürür. (Devralındığı yer: Attribute) |
GetType() |
Type Geçerli örneğini 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 Objectöğesinin sığ bir kopyasını oluşturur. (Devralındığı yer: Object) |
ToString() |
Geçerli nesneyi temsil eden dizeyi döndürür. (Devralındığı yer: Object) |
Belirtik Arabirim Kullanımları
_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 sunulan özelliklere ve yöntemlere erişim sağlar. (Devralındığı yer: Attribute) |