Partager via


FaultContractAttribute Classe

Définition

Spécifie une ou plusieurs fautes SOAP retournées lorsqu'une opération de service rencontre des erreurs de traitement.

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
Héritage
FaultContractAttribute
Attributs

Exemples

L'exemple de code suivant illustre l'utilisation de FaultContractAttribute pour spécifier que l'opération SampleMethod peut retourner une erreur SOAP avec le type de détail 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

L’exemple de code suivant montre que les clients WCF de l’expérience ISampleService de cette erreur SOAP en tant que FaultException<TDetail> 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.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

Remarques

Marquez une opération avec l’attribut FaultContractAttribute pour déclarer une ou plusieurs conditions d’exception spécifiques ajoutées à la description WSDL (Web Service Description Language) de l’opération de service en tant que messages d’erreur SOAP explicites retournés par l’opération.

Dans toutes les applications managées, les erreurs de traitement sont représentées par des objets Exception. Dans les applications SOAP telles que les applications Windows Communication Foundation (WCF), les méthodes de service communiquent les informations d’erreur de traitement à l’aide de messages d’erreur SOAP. Étant donné que les applications WCF s’exécutent sous les deux types de systèmes d’erreur, toutes les informations d’exception managées qui doivent être envoyées au client doivent être converties d’exceptions en erreurs SOAP. Vous pouvez utiliser les comportements d'exception de service par défaut ou vous pouvez contrôler explicitement si (et comment) les exceptions sont mappées aux messages d'erreur. Pour obtenir une vue d’ensemble des exceptions et des erreurs SOAP dans les applications WCF, consultez Spécification et gestion des erreurs dans les contrats et les services.

Il est recommandé d’utiliser les FaultContractAttribute opérations de service pour spécifier formellement toutes les erreurs SOAP qu’un client peut s’attendre à recevoir dans le cours normal d’une opération. Il est également recommandé que seules les informations qu'un client doit connaître soient retournées dans une faute SOAP pour réduire la divulgation d'informations.

  • La Action propriété contrôle l’action du message d’erreur.

  • La DetailType propriété obtient le type de l’objet de détail sérialisé dans le message d’erreur.

  • Les Name propriétés et Namespace le nom contrôlent respectivement le nom et l’espace de noms du message d’erreur.

  • Indique HasProtectionLevel si le message d’erreur a un niveau de protection spécifié et, le cas échéant, la ProtectionLevel propriété contrôle ce niveau de protection.

Attention

Si un message d’erreur contient des informations sensibles ou peut entraîner des problèmes de sécurité, il est fortement recommandé de définir la ProtectionLevel propriété.

Pour de nombreux scénarios, la définition ProtectionLevel des messages d’erreur EncryptAndSign est suffisante. Pour plus d’informations, consultez Présentation du niveau de protection.

Pour retourner une erreur spécifiée à partir d’une opération marquée avec FaultContractAttribute, lèvez une FaultException<TDetail> exception (où le paramètre de type est les informations d’erreur sérialisables) lorsque l’exception managée se produit pendant l’opération. Les applications clientes WCF mettent en évidence l’erreur SOAP comme le même type que celui qui a été levée dans l’implémentation du client, c’est-à-dire en tant que FaultException<TDetail> (où les paramètres de type sont les informations d’erreur sérialisables). Il FaultContractAttribute ne peut être utilisé que pour spécifier des erreurs SOAP pour les opérations de service bidirectionnelles et pour les paires d’opérations asynchrones ; les opérations unidirectionnelles ne prennent pas en charge les erreurs SOAP et ne prennent donc pas en charge FaultContractAttribute.

Notes

Vous pouvez utiliser tout type sérialisable pour transmettre des informations sur l'erreur. La seule restriction dans cette version de WCF est que les types spécifiés dans un FaultContractAttribute doit être sérialisable par le System.Runtime.Serialization.DataContractSerializer. Pour la prise en charge DataContractSerializer de la sérialisation, consultez Le sérialiseur de contrat de données.

Par exemple, pour spécifier que les clients peuvent s’attendre à une erreur SOAP qui contient un Int32paramètre de type dans la FaultContractAttribute méthode de service.

Notes

Les exemples de code suivants ne définissent pas les propriétés ou Namespace les ProtectionLevelNamepropriétés.

[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

Ensuite, dans votre méthode de service, lèvez un nouvel FaultException<TDetail> emplacement où le paramètre de type est le type qui contient les informations d’erreur (dans le cas ci-dessus, a Int32). Exemple :

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

L’exemple précédent est très simple ; presque toutes les informations peuvent être passées à l’aide d’un System.Int32 code, de sorte que ce type de détail n’est pas le plus utile. En règle générale, les applications WCF spécifient des erreurs SOAP avec des types de détails spécifiques aux exigences d’informations d’erreur du client. Pour obtenir un exemple plus complet, consultez la section Exemple.

Notes

Si vous spécifiez un FaultException<TDetail> emplacement où le paramètre de type est un System.String, la valeur de chaîne est affectée à la propriété Detail dans l’application cliente ; les clients ne peuvent pas récupérer cette chaîne en appelant la FaultException<TDetail>.ToString méthode. Pour que la valeur de chaîne soit retournée lorsque l'application cliente appelle Exception.ToString, levez une exception System.ServiceModel.FaultException dans l'opération et passez la chaîne au constructeur.

Pour contrôler explicitement le comportement de l’application lorsqu’une exception ou FaultException<TDetail> est levée, implémentez l’interface System.ServiceModel.Dispatcher.IErrorHandler sur un System.ServiceModel.Description.IServiceBehavior, System.ServiceModel.Description.IContractBehavior ou System.ServiceModel.Description.IEndpointBehavior affectez-la à la ChannelDispatcher.ErrorHandlers propriété. IErrorHandler vous permet de contrôler explicitement l’erreur SOAP générée et de le renvoyer au client.

Pour faciliter le débogage, définissez-le dans le ServiceBehaviorAttribute.IncludeExceptionDetailInFaults true code ou vous pouvez l’utiliser ServiceDebugBehavior.IncludeExceptionDetailInFaults dans un fichier de configuration d’application. En cas d'activation, le service retourne automatiquement les informations sur les exceptions à l'appelant. Ces erreurs apparaissent au client comme FaultException des exceptions.

Important

Étant donné que les exceptions gérées peuvent exposer des informations d’application interne, définir ServiceBehaviorAttribute.IncludeExceptionDetailInFaults ou ServiceDebugBehavior.IncludeExceptionDetailInFaults true autoriser les clients WCF à obtenir des informations sur les exceptions d’opération de service interne, y compris l’identification personnelle ou d’autres informations sensibles.

Par conséquent, l'affectation de la valeur ServiceBehaviorAttribute.IncludeExceptionDetailInFaults à ServiceDebugBehavior.IncludeExceptionDetailInFaults ou true est uniquement recommandée comme une façon de déboguer temporairement une application de service. De plus, le WSDL pour une méthode qui retourne des exceptions managées non prises en charge de cette façon ne contient pas le contrat pour le FaultException<TDetail> de type String. Les clients doivent s’attendre à ce qu’une erreur SOAP inconnue (retournée aux clients WCF en tant qu’objets System.ServiceModel.FaultException ) obtienne correctement les informations de débogage.

Constructeurs

FaultContractAttribute(Type)

Initialise une nouvelle instance de la classe FaultContractAttribute.

Propriétés

Action

Obtient ou définit l'action du message d'erreur SOAP spécifié dans le cadre du contrat d'opération.

DetailType

Obtient le type d'un objet sérialisable qui contient des informations sur l'erreur.

HasProtectionLevel

Obtient une valeur qui indique si un niveau de protection a été assigné au message d'erreur SOAP.

Name

Obtient ou définit le nom du message d'erreur dans WSDL (Web Services Description Language).

Namespace

Obtient ou définit l'espace de noms de l'erreur SOAP.

ProtectionLevel

Spécifie le niveau de protection que l'erreur SOAP requiert de la liaison.

TypeId

Lors de l'implémentation dans une classe dérivée, obtient un identificateur unique pour l'objet Attribute.

(Hérité de Attribute)

Méthodes

Equals(Object)

Retourne une valeur qui indique si cette instance est égale à un objet spécifié.

(Hérité de Attribute)
GetHashCode()

Retourne le code de hachage de cette instance.

(Hérité de Attribute)
GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
IsDefaultAttribute()

En cas de substitution dans une classe dérivée, indique si la valeur de cette instance est la valeur par défaut pour la classe dérivée.

(Hérité de Attribute)
Match(Object)

En cas de substitution dans une classe dérivée, retourne une valeur indiquant si cette instance équivaut à un objet spécifié.

(Hérité de Attribute)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)

Implémentations d’interfaces explicites

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

Mappe un jeu de noms avec un jeu correspondant d'identificateurs de dispatch.

(Hérité de Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Récupère les informations de type pour un objet, qui peuvent être utilisées pour obtenir les informations de type d'une interface.

(Hérité de Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Récupère le nombre d'interfaces d'informations de type fourni par un objet (0 ou 1).

(Hérité de Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fournit l'accès aux propriétés et aux méthodes exposées par un objet.

(Hérité de Attribute)

S’applique à