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, işleminin ayrıntı türü GreetingFaultolan 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ü 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 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.

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)

Şunlara uygulanır