FaultContractAttribute Clase

Definición

Especifica uno o más errores de SOAP que se devuelven cuando se producen errores de procesamiento en una operación de servicio.

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
Herencia
FaultContractAttribute
Atributos

Ejemplos

El ejemplo de código siguiente muestra el uso de FaultContractAttribute para especificar que la operación SampleMethod puede devolver un error de SOAP con el tipo de detalle de 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.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

En el ejemplo de código siguiente se muestra que los clientes WCF de ISampleService experimentan este error soap como de FaultException<TDetail> tipo 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.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

Comentarios

Marque una operación con el FaultContractAttribute atributo para declarar una o varias condiciones de excepción específicas que se agregan a la descripción del lenguaje de descripción del servicio web (WSDL) de la operación de servicio como mensajes de error SOAP explícitos devueltos por la operación.

En todas las aplicaciones administradas, los errores de procesamiento están representados mediante objetos Exception. En aplicaciones basadas en SOAP, como aplicaciones de Windows Communication Foundation (WCF), los métodos de servicio comunican la información de procesamiento de errores mediante mensajes de error SOAP. Dado que las aplicaciones WCF se ejecutan en ambos tipos de sistemas de error, cualquier información de excepción administrada que se debe enviar al cliente debe convertirse de excepciones en errores soap. Puede usar los comportamientos de excepción de servicio predeterminados o controlar explícitamente si (y cómo) las excepciones se asignan a los mensajes de error. Para obtener información general sobre las excepciones y los errores de SOAP en las aplicaciones WCF, consulte Especificación y control de errores en contratos y servicios.

Se recomienda que las operaciones de servicio usen FaultContractAttribute para especificar formalmente todos los errores soap que un cliente puede esperar recibir en el curso normal de una operación. Además, se recomienda que sólo se devuelva en un error de SOAP la información que un cliente deba conocer para minimizar la divulgación de información.

  • La Action propiedad controla la acción del mensaje de error.

  • La DetailType propiedad obtiene el tipo del objeto de detalle serializado en el mensaje de error.

  • Las Name propiedades y Namespace controlan el nombre y el espacio de nombres, respectivamente, del mensaje de error.

  • HasProtectionLevel indica si el mensaje de error tiene un nivel de protección especificado y, si es así, la ProtectionLevel propiedad controla ese nivel de protección.

Precaución

Si un mensaje de error contiene información confidencial o puede provocar problemas de seguridad, se recomienda encarecidamente establecer la ProtectionLevel propiedad .

Para muchos escenarios, establecer en ProtectionLevel EncryptAndSign para los mensajes de error es suficiente. Para obtener más información, consulte Descripción del nivel de protección.

Para devolver un error especificado de una operación marcada con FaultContractAttribute, inicie ( FaultException<TDetail> donde el parámetro type es la información de error serializable) cuando se produce la excepción administrada durante la operación. Las aplicaciones cliente de WCF exponen el error soap que el mismo tipo que se produjo en la implementación del cliente, es decir, como , FaultException<TDetail> que es (donde typeparameter es la información de error serializable). FaultContractAttribute solo se puede usar para especificar errores SOAP para operaciones de servicio bidireccionales y para pares de operaciones asincrónicas; las operaciones unidireccionales no admiten errores SOAP y, por lo tanto, no admiten FaultContractAttribute.

Nota

Puede utilizar cualquier tipo serializable para llevar información de error. La única restricción de esta versión de WCF es que los tipos especificados en un FaultContractAttribute objeto deben ser serializables por .System.Runtime.Serialization.DataContractSerializer Para obtener la compatibilidad DataContractSerializer con la serialización, consulte Serializador de contrato de datos.

Por ejemplo, para especificar que los clientes pueden esperar un error soap que contenga un Int32, coloque ese parámetro de tipo en en el FaultContractAttribute método de servicio.

Nota

Los ejemplos de código siguientes no establecen las ProtectionLevelpropiedades , Nameo Namespace .

[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

A continuación, en el método de servicio, inicie un nuevo FaultException<TDetail> donde el parámetro type es el tipo que contiene la información de error (en el caso anterior, ).Int32 Por ejemplo:

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

El ejemplo anterior es muy básico; casi cualquier información se puede pasar mediante un System.Int32 código, por lo que este tipo de detalle no es el más útil. Normalmente, las aplicaciones WCF especifican errores SOAP con tipos de detalle específicos de los requisitos de información de error del cliente. Para obtener un ejemplo más completo, consulte la sección Ejemplo.

Nota

Si especifica un FaultException<TDetail> donde el parámetro type es , System.Stringel valor de cadena se asigna a la propiedad Detail de la aplicación cliente; los clientes no pueden recuperar esa cadena llamando al FaultException<TDetail>.ToString método . Para que se devuelva el valor de la cadena cuando la aplicación cliente llama a Exception.ToString, se inicia una excepción System.ServiceModel.FaultException dentro de la operación y se pasa la cadena al constructor.

Para controlar explícitamente el comportamiento de la aplicación cuando se produce una excepción o FaultException<TDetail> se produce, implemente la System.ServiceModel.Dispatcher.IErrorHandler interfaz en o System.ServiceModel.Description.IEndpointBehavior System.ServiceModel.Description.IServiceBehaviorSystem.ServiceModel.Description.IContractBehavior y asígnela a la ChannelDispatcher.ErrorHandlers propiedad . IErrorHandler permite controlar explícitamente el error soap que se genera y si se devuelve al cliente.

Para facilitar la depuración, establezca en ServiceBehaviorAttribute.IncludeExceptionDetailInFaults true en el código o puede usar en ServiceDebugBehavior.IncludeExceptionDetailInFaults un archivo de configuración de aplicación. Cuando se habilita, el servicio devuelve automáticamente información de excepción al autor de la llamada. Estos errores aparecen en el cliente como FaultException excepciones.

Importante

Dado que las excepciones administradas pueden exponer información interna de la aplicación, establecer ServiceBehaviorAttribute.IncludeExceptionDetailInFaults o ServiceDebugBehavior.IncludeExceptionDetailInFaults para true permitir que los clientes WCF obtengan información sobre las excepciones de operaciones de servicio internas, incluida la identificación personal u otra información confidencial.

Por consiguiente, establecer ServiceBehaviorAttribute.IncludeExceptionDetailInFaults o ServiceDebugBehavior.IncludeExceptionDetailInFaults en true solo está recomendado como una manera de depurar temporalmente una aplicación de servicio. Además, el WSDL de un método que devuelve excepciones administradas no controladas de esta manera no contiene el contrato para la FaultException<TDetail> de tipo String. Los clientes deben esperar la posibilidad de un error SOAP desconocido (devuelto a los clientes WCF como System.ServiceModel.FaultException objetos) para obtener la información de depuración correctamente.

Constructores

FaultContractAttribute(Type)

Inicializa una nueva instancia de la clase FaultContractAttribute.

Propiedades

Action

Obtiene o establece la acción del mensaje de error de SOAP que se especifica como parte del contrato de la operación.

DetailType

Obtiene el tipo de un objeto serializable que contiene información de error.

HasProtectionLevel

Obtiene un valor que indica si el mensaje de error de SOAP tiene un nivel de protección asignado.

Name

Obtiene o establece el nombre del mensaje de error en el Lenguaje de descripción de servicios Web (WSDL).

Namespace

Obtiene o establece el espacio de nombres del error de SOAP.

ProtectionLevel

Especifica el nivel de protección que el error de SOAP requiere del enlace.

TypeId

Cuando se implementa en una clase derivada, obtiene un identificador único para este Attribute.

(Heredado de Attribute)

Métodos

Equals(Object)

Devuelve un valor que indica si esta instancia es igual que un objeto especificado.

(Heredado de Attribute)
GetHashCode()

Devuelve el código hash de esta instancia.

(Heredado de Attribute)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
IsDefaultAttribute()

Si se reemplaza en una clase derivada, indica si el valor de esta instancia es el valor predeterminado de la clase derivada.

(Heredado de Attribute)
Match(Object)

Cuando se invalida en una clase derivada, devuelve un valor que indica si esta instancia es igual a un objeto especificado.

(Heredado de Attribute)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Implementaciones de interfaz explícitas

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

Asigna un conjunto de nombres a un conjunto correspondiente de identificadores de envío.

(Heredado de Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Obtiene la información de tipos de un objeto, que puede utilizarse para obtener la información de tipos de una interfaz.

(Heredado de Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Recupera el número de interfaces de información de tipo que proporciona un objeto (0 ó 1).

(Heredado de Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Proporciona acceso a las propiedades y los métodos expuestos por un objeto.

(Heredado de Attribute)

Se aplica a