FaultContractAttribute FaultContractAttribute FaultContractAttribute FaultContractAttribute Class

Определение

Задает одну или несколько ошибок протокола SOAP, сообщения о которых возвращаются, когда операция службы обнаруживает ошибки обработки.Specifies one or more SOAP faults that are returned when a service operation encounters processing errors.

public ref class FaultContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=true, Inherited=false)]
public sealed class FaultContractAttribute : Attribute
type FaultContractAttribute = class
    inherit Attribute
Public NotInheritable Class FaultContractAttribute
Inherits Attribute
Наследование
FaultContractAttributeFaultContractAttributeFaultContractAttributeFaultContractAttribute
Атрибуты

Примеры

В следующем примере кода показано, как с помощью атрибута FaultContractAttribute указать, что операция SampleMethod может возвращать ошибку SOAP с типом по умолчанию GreetingFault.The following code example shows the use of FaultContractAttribute to specify that the SampleMethod operation can return a SOAP fault with the detail type of GreetingFault.

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
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

В следующем примере кода показано, что клиенты WCF ISampleService возникнуть эта ошибка SOAP выглядит как FaultException<TDetail> типа GreetingFault.The following code example shows that WCF clients of ISampleService experience this SOAP fault as a FaultException<TDetail> of type GreetingFault.

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
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

Комментарии

Отметьте операцию атрибутом FaultContractAttribute для объявления одного или нескольких конкретных условий исключений, которые добавляются в описание WSDL операции службы в виде явных сообщений об ошибках SOAP, возвращаемых операцией.Mark an operation with the FaultContractAttribute attribute to declare one or more specific exception conditions that are added to the Web Service Description Language (WSDL) description of the service operation as explicit SOAP fault messages returned by the operation.

Во всех управляемых приложениях обработка ошибок представлена объектами Exception.In all managed applications, processing errors are represented by Exception objects. В приложениях на базе SOAP, таких как приложения Windows Communication Foundation (WCF) методы службы передают сведения об ошибке обработки с помощью сообщения об ошибках SOAP.In SOAP-based applications such as Windows Communication Foundation (WCF) applications, service methods communicate processing error information using SOAP fault messages. Поскольку приложения WCF, выполняются в системах ошибок обоих типов, любые сведения управляемых исключений, которая должна быть отправлена клиенту должны преобразовываться из исключений в ошибки SOAP.Because WCF applications execute under both types of error systems, any managed exception information that must be sent to the client must be converted from exceptions into SOAP faults. Можно использовать поведения исключений службы по умолчанию или явно управлять тем, будут ли исключения сопоставляться с сообщениями об ошибках и как будет выполняться это сопоставление.You can use the default service exception behaviors, or you can explicitly control whether -- and how -- exceptions are mapped to fault messages. Обзор исключения и ошибки SOAP в приложениях WCF, см. в разделе задание и обработка сбоев в контрактах и службах.For an overview of exceptions and SOAP faults in WCF applications, see Specifying and Handling Faults in Contracts and Services.

Рекомендуется, чтобы операции службы использовали атрибут FaultContractAttribute для формального указания всех ошибок SOAP, которые клиент может получить во время обычной операции.It is recommended that service operations use the FaultContractAttribute to formally specify all SOAP faults that a client can expect to receive in the normal course of an operation. Кроме того, чтобы свести к минимуму раскрытие информации, рекомендуется возвращать в сообщении об ошибке SOAP только те сведения, которые необходимо знать клиенту.It is also recommended that only that information a client must know is returned in a SOAP fault to minimize information disclosure.

  • Свойство Action управляет действием сообщения об ошибке.The Action property controls the action of the fault message.

  • Свойство DetailType возвращает тип объекта сведений, сериализованного в сообщении об ошибке.The DetailType property gets the type of the detail object serialized in the fault message.

  • Свойства Name и Namespace управляют именем и пространством имен сообщения об ошибке, соответственно.The Name and Namespace properties control the name and namespace, respectively, of the fault message.

  • Свойство HasProtectionLevel указывает, имеет ли сообщение об ошибке заданный уровень защиты, и, если да, свойство ProtectionLevel управляет этим уровнем защиты.The HasProtectionLevel indicates whether the fault message has a protection level specified, and if so, the ProtectionLevel property controls that level of protection.

Внимание!

Если сообщение об ошибке содержит конфиденциальную информацию или может привести к проблемам с безопасностью, настоятельно рекомендуется задать свойство ProtectionLevel.If a fault message carries information that is sensitive or can lead to security problems, it is strongly recommended that the ProtectionLevel property be set.

  • Если для свойства ProtectionLevel явно задается значение ProtectionLevel.Sign или ProtectionLevel.EncryptAndSign, необходимо использовать привязку с разрешенным для нее с помощью свойства System.ServiceModel.SecurityMode обеспечением безопасности. В противном случае будет вызвано исключение.If you set the ProtectionLevel explicitly to either ProtectionLevel.Sign or ProtectionLevel.EncryptAndSign, then you must use a binding with security enabled using the System.ServiceModel.SecurityMode property on the binding or an exception is thrown.

  • Если выбирается привязка, разрешающая обеспечение безопасности, а свойство ProtectionLevel нигде в контракте не задается, все данные приложений будут шифроваться и подписываться.If you select a binding that enables security and you do not set the ProtectionLevel property anywhere on the contract, all application data will be encrypted and signed.

  • Если выбирается привязка, в которой не разрешено обеспечение безопасности (например, в классе System.ServiceModel.BasicHttpBinding обеспечение безопасности запрещено по умолчанию), и свойство ProtectionLevel явно не задано, данные приложений защищаться не будут.If you select a binding that does not have security enabled (for example, the System.ServiceModel.BasicHttpBinding has security disabled by default), and the ProtectionLevel is not explicitly set, then none of the application data will be protected.

Во многих случаях достаточно присвоить свойству ProtectionLevel значение EncryptAndSign для сообщений об ошибках.For many scenarios setting ProtectionLevel to EncryptAndSign for fault messages is sufficient. Дополнительные сведения см. в разделе уровень защиты понимание.For more details, see Understanding Protection Level.

Чтобы возвратить указанную ошибку из операции, отмеченной атрибутом FaultContractAttribute, вызовите исключение FaultException<TDetail> (где параметр типа содержит сериализуемые сведения об ошибке) при возникновении управляемого исключения во время операции.To return a specified fault from an operation marked with FaultContractAttribute, throw a FaultException<TDetail> (where the type parameter is the serializable error information) when the managed exception occurs during the operation. WCF области клиентских приложений ошибки SOAP с тем же типом как создавалось в клиентской реализации, то есть как FaultException<TDetail> (где typeparameter — сериализуемые сведения об ошибке).WCF client applications surface the SOAP fault as the same type as was thrown in the client implementation -- that is, as a FaultException<TDetail> (where the typeparameter is the serializable error information). Атрибут FaultContractAttribute может использоваться только для указания ошибок SOAP для двусторонних операций служб и для пар асинхронных операций; односторонние операции не поддерживают ошибки SOAP и, следовательно, атрибут FaultContractAttribute.The FaultContractAttribute can be used only to specify SOAP faults for two-way service operations and for asynchronous operation pairs; one-way operations do not support SOAP faults and therefore do not support FaultContractAttribute.

Примечание

Для передачи информации об ошибках можно использовать любой сериализуемый тип.You can use any serializable type to convey error information. Единственным ограничением в этой версии WCF является то, что типы, указанные в FaultContractAttribute должен быть сериализуем методом System.Runtime.Serialization.DataContractSerializer.The only restriction in this version of WCF is that types specified in a FaultContractAttribute must be serializable by the System.Runtime.Serialization.DataContractSerializer. Для поддержки сериализации DataContractSerializer предоставляет, см. в разделе сериализатор контракта данных.For the serialization support the DataContractSerializer provides, see Data Contract Serializer.

Например, чтобы задать, что клиенты могут ожидать сообщение об ошибке SOAP, содержащее Int32, разместите этот параметр типа в атрибуте FaultContractAttribute метода службы.For example, to specify that clients can expect a SOAP fault that contains an Int32, place that type parameter in the FaultContractAttribute on your service method.

Примечание

В приведенных ниже примерах кода не задаются свойства ProtectionLevel, Name и Namespace.The following code examples do not set the ProtectionLevel, Name, or Namespace properties.

[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

Затем в методе службы вызовите новое исключение FaultException<TDetail>, где параметром типа является тип, содержащий информацию об ошибке (в представленном выше случае — Int32).Then, in your service method, throw a new FaultException<TDetail> where the type parameter is the type that contains the error information (in the above case, a Int32). Например:For example:

throw new FaultException<int>(4);
Throw New FaultException(Of Integer)(4)

Представленный пример — очень общий; почти любая информация может быть передана с помощью кода System.Int32, поэтому этот тип сведений не является наиболее полезным.The preceding example is very basic; almost any information can be passed using an System.Int32 code, so this detail type is not the most useful. Как правило приложения WCF задания ошибок SOAP с типами сведений, связанными с требованиями сведения ошибка клиента.Typically, WCF applications specify SOAP faults with detail types specific to the error information requirements of the client. Более полный пример см. в подразделе "Пример".For a more complete example, see the Example section.

Примечание

Если задается исключение FaultException<TDetail>, где параметр типа — System.String, свойству Detail в клиентском приложении присваивается строковое значение; клиенты не могут извлекать эту строку путем вызова метода FaultException<TDetail>.ToString.If you specify a FaultException<TDetail> where the type parameter is a System.String, the string value is assigned to the Detail property in the client application; clients cannot retrieve that string by calling the FaultException<TDetail>.ToString method. Чтобы при вызове клиентским приложением метода Exception.ToString возвращалось строковое значение, необходимо вызывать исключение System.ServiceModel.FaultException внутри операции и передавать строку конструктору.To have the string value returned when the client application calls Exception.ToString, throw a System.ServiceModel.FaultException exception inside the operation and pass the string to the constructor.

Для явного управления поведением приложения в случае возникновения исключения или FaultException<TDetail>, реализуйте интерфейс System.ServiceModel.Dispatcher.IErrorHandler на System.ServiceModel.Description.IServiceBehavior, System.ServiceModel.Description.IContractBehavior или System.ServiceModel.Description.IEndpointBehavior и добавьте его к свойству ChannelDispatcher.ErrorHandlers.To explicitly control the behavior of the application when an exception or FaultException<TDetail> is thrown, implement the System.ServiceModel.Dispatcher.IErrorHandler interface on an System.ServiceModel.Description.IServiceBehavior, System.ServiceModel.Description.IContractBehavior or System.ServiceModel.Description.IEndpointBehavior and assign it to the ChannelDispatcher.ErrorHandlers property. IErrorHandler позволяет явно управлять ошибку SOAP, который создается и следует ли отправлять их обратно клиенту.IErrorHandler enables you to explicitly control the SOAP fault that is generated and whether to send it back to the client.

Чтобы упростить отладку, задайте ServiceBehaviorAttribute.IncludeExceptionDetailInFaults для true можно использовать в коде или ServiceDebugBehavior.IncludeExceptionDetailInFaults в файле конфигурации приложения.To facilitate debugging, set the ServiceBehaviorAttribute.IncludeExceptionDetailInFaults to true in code or you can use the ServiceDebugBehavior.IncludeExceptionDetailInFaults in an application configuration file. Когда эта функция включена, служба автоматически возвращает вызывающему объекту информацию об исключениях.When enabled, the service automatically returns exception information to the caller. Эти ошибки выглядят для клиента как исключения FaultException.These faults appear to the client as FaultException exceptions.

Важно!

Поскольку управляемые исключения могут предоставлять внутренние сведения о приложении, задание ServiceBehaviorAttribute.IncludeExceptionDetailInFaults или ServiceDebugBehavior.IncludeExceptionDetailInFaults для true должен поддерживать клиенты WCF для получения сведений о внутренних исключениях операций службы, включая личные идентифицируемую и другую конфиденциальную информацию.Because managed exceptions can expose internal application information, setting ServiceBehaviorAttribute.IncludeExceptionDetailInFaults or ServiceDebugBehavior.IncludeExceptionDetailInFaults to true can permit WCF clients to obtain information about internal service operation exceptions, including personally identifiable or other sensitive information.

Поэтому задавать для свойства ServiceBehaviorAttribute.IncludeExceptionDetailInFaults или ServiceDebugBehavior.IncludeExceptionDetailInFaults значение true рекомендуется только для временной отладки приложения службы.Therefore, setting ServiceBehaviorAttribute.IncludeExceptionDetailInFaults or ServiceDebugBehavior.IncludeExceptionDetailInFaults to true is only recommended as a way of temporarily debugging a service application. Кроме того, WSDL для метода, который возвращает такие необработанные управляемые исключения, не содержит контракт для исключения FaultException<TDetail> типа String.In addition, the WSDL for a method that returns unhandled managed exceptions in this way does not contain the contract for the FaultException<TDetail> of type String. Клиентах должна быть возможность получения неизвестной ошибки SOAP (возвращаются клиентам WCF как System.ServiceModel.FaultException объектов) для получения отладочной информации должным образом.Clients must expect the possibility of an unknown SOAP fault (returned to WCF clients as System.ServiceModel.FaultException objects) to obtain the debugging information properly.

Конструкторы

FaultContractAttribute(Type) FaultContractAttribute(Type) FaultContractAttribute(Type) FaultContractAttribute(Type)

Инициализирует новый экземпляр класса FaultContractAttribute.Initializes a new instance of the FaultContractAttribute class.

Свойства

Action Action Action Action

Возвращает или задает действие сообщения об ошибке SOAP, которое задается как компонент контракта операции.Gets or sets the action of the SOAP fault message that is specified as part of the operation contract.

DetailType DetailType DetailType DetailType

Возвращает тип сериализуемого объекта, который содержит информацию об ошибке.Gets the type of a serializable object that contains error information.

HasProtectionLevel HasProtectionLevel HasProtectionLevel HasProtectionLevel

Возвращает значение, указывающее, присвоен ли сообщению об ошибке SOAP уровень защиты.Gets a value that indicates whether the SOAP fault message has a protection level assigned.

Name Name Name Name

Возвращает или задает имя сообщения об ошибке в языке WSDL.Gets or sets the name of the fault message in Web Services Description Language (WSDL).

Namespace Namespace Namespace Namespace

Возвращает или задает пространство имен ошибки SOAP.Gets or sets the namespace of the SOAP fault.

ProtectionLevel ProtectionLevel ProtectionLevel ProtectionLevel

Задает уровень защиты, который требуется от привязки для ошибки SOAP.Specifies the level of protection the SOAP fault requires from the binding.

TypeId TypeId TypeId TypeId

При реализации в производном классе возвращает уникальный идентификатор для этого Attribute.When implemented in a derived class, gets a unique identifier for this Attribute.

(Inherited from Attribute)

Методы

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Возвращает значение, указывающее, равен ли этот экземпляр указанному объекту.Returns a value that indicates whether this instance is equal to a specified object.

(Inherited from Attribute)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Возвращает хэш-код для данного экземпляра.Returns the hash code for this instance.

(Inherited from Attribute)
GetType() GetType() GetType() GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Inherited from Object)
IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute()

При переопределении в производном классе показывает, является ли значение данного экземпляра значением по умолчанию для производного класса.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(Inherited from Attribute)
Match(Object) Match(Object) Match(Object) Match(Object)

При переопределении в производном классе возвращает значение, указывающее, является ли этот экземпляр равным заданному объекту.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(Inherited from Attribute)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Inherited from Object)

Явные реализации интерфейса

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Сопоставляет набор имен соответствующему набору идентификаторов диспетчеризации.Maps a set of names to a corresponding set of dispatch identifiers.

(Inherited from Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Возвращает сведения о типе объекта, которые могут использоваться для получения сведений о типе интерфейса.Retrieves the type information for an object, which can be used to get the type information for an interface.

(Inherited from Attribute)
_Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32)

Возвращает количество предоставляемых объектом интерфейсов для доступа к сведениям о типе (0 или 1).Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(Inherited from Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Предоставляет доступ к открытым свойствам и методам объекта.Provides access to properties and methods exposed by an object.

(Inherited from Attribute)

Применяется к