Aracılığıyla paylaş


FaultContractAttribute Sınıf

Tanım

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
FaultContractAttribute
Ö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.

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)

Şunlara uygulanır