FaultContractAttribute Klas

Definitie

Hiermee geeft u een of meer SOAP-fouten op die worden geretourneerd wanneer een servicebewerking verwerkingsfouten tegenkomt.

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
Overname
FaultContractAttribute
Kenmerken

Voorbeelden

In het volgende codevoorbeeld ziet u het gebruik van FaultContractAttribute om op te geven dat de SampleMethod-bewerking een SOAP-fout kan retourneren met het detailtype 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

In het volgende codevoorbeeld ziet u dat WCF-clients van ISampleService deze SOAP-fout als type FaultException<TDetail>GreetingFaultervaren.

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

Opmerkingen

Markeer een bewerking met het FaultContractAttribute kenmerk om een of meer specifieke uitzonderingsvoorwaarden te declareren die worden toegevoegd aan de WSDL-beschrijving (Web Service Description Language) van de servicebewerking als expliciete SOAP-foutberichten die door de bewerking worden geretourneerd.

In alle beheerde toepassingen worden verwerkingsfouten weergegeven door Exception objecten. In SOAP-toepassingen, zoals Windows Communication Foundation (WCF)-toepassingen, communiceren servicemethoden foutinformatie met behulp van SOAP-foutberichten. Omdat WCF-toepassingen worden uitgevoerd onder beide typen foutsystemen, moeten beheerde uitzonderingsgegevens die naar de client moeten worden verzonden, worden geconverteerd van uitzonderingen naar SOAP-fouten. U kunt het standaardgedrag van service-uitzonderingen gebruiken of u kunt expliciet bepalen of -- en hoe -- uitzonderingen worden toegewezen aan foutberichten. Zie Voor een overzicht van uitzonderingen en SOAP-fouten in WCF-toepassingen opgeven en afhandelen van fouten in contracten en services.

Het wordt aanbevolen om servicebewerkingen te FaultContractAttribute gebruiken om formeel alle SOAP-fouten op te geven die een client in de normale loop van een bewerking kan verwachten. Het wordt ook aanbevolen dat alleen die informatie die een client moet weten, wordt geretourneerd in een SOAP-fout om de openbaarmaking van informatie te minimaliseren.

  • De Action eigenschap bepaalt de actie van het foutbericht.

  • De DetailType eigenschap haalt het type van het detailobject op dat in het foutbericht wordt geserialiseerd.

  • De Name en Namespace eigenschappen bepalen respectievelijk de naam en naamruimte van het foutbericht.

  • Hiermee HasProtectionLevel wordt aangegeven of het foutbericht een beveiligingsniveau heeft opgegeven, en zo ja, bepaalt de ProtectionLevel eigenschap dat beveiligingsniveau.

Caution

Als een foutbericht informatie bevat die gevoelig is of kan leiden tot beveiligingsproblemen, wordt het sterk aanbevolen om de ProtectionLevel eigenschap in te stellen.

Voor veel scenario's is het voldoende om foutberichten in te EncryptAndSign stellenProtectionLevel. Zie Understanding Protection Level (Beveiligingsniveau) voor meer informatie.

Als u een opgegeven fout wilt retourneren van een bewerking die is gemarkeerd met FaultContractAttribute, genereert u een FaultException<TDetail> (waarbij de typeparameter de serialiseerbare foutinformatie is) wanneer de beheerde uitzondering optreedt tijdens de bewerking. WCF-clienttoepassingen laten de SOAP-fout zien als hetzelfde type als is opgetreden in de clientimplementatie, dat wil gezegd, als een FaultException<TDetail> (waarbij de typeparameter de serialiseerbare foutinformatie is). De FaultContractAttribute kan alleen worden gebruikt om SOAP-fouten op te geven voor servicebewerkingen in twee richtingen en voor asynchrone bewerkingen; eenmalige bewerkingen bieden geen ondersteuning voor SOAP-fouten en bieden daarom geen ondersteuning FaultContractAttributevoor SOAP-fouten.

Note

U kunt elk serialiseerbare type gebruiken om foutinformatie over te brengen. De enige beperking in deze versie van WCF is dat typen die zijn opgegeven in een FaultContractAttribute moeten worden serialiseerbaar door de System.Runtime.Serialization.DataContractSerializer. Zie Voor de serialisatieondersteuning die het DataContractSerializer biedt, data contract serializer.

Als u bijvoorbeeld wilt opgeven dat clients een SOAP-fout kunnen verwachten die een Int32SOAP-fout bevat, plaatst u die typeparameter in de FaultContractAttribute servicemethode.

Note

In de volgende codevoorbeelden worden de ProtectionLeveleigenschappen of Namespace eigenschappen Nameniet ingesteld.

[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

Vervolgens genereert u in uw servicemethode een nieuw FaultException<TDetail> type waarbij de typeparameter het type is dat de foutgegevens bevat (in het bovenstaande geval een Int32). Voorbeeld:

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

Het voorgaande voorbeeld is zeer eenvoudig; bijna alle informatie kan worden doorgegeven met behulp van een System.Int32 code, dus dit detailtype is niet het nuttigst. WCF-toepassingen geven doorgaans SOAP-fouten op met gedetailleerde typen die specifiek zijn voor de vereisten voor foutinformatie van de client. Zie de sectie Voorbeeld voor een volledig voorbeeld.

Note

Als u opgeeft FaultException<TDetail> waar de typeparameter een System.Stringis, wordt de tekenreekswaarde toegewezen aan de eigenschap Detail in de clienttoepassing. Clients kunnen die tekenreeks niet ophalen door de FaultException<TDetail>.ToString methode aan te roepen. Als u de tekenreekswaarde wilt laten retourneren wanneer de clienttoepassing aanroept Exception.ToString, genereert u een System.ServiceModel.FaultException uitzondering in de bewerking en geeft u de tekenreeks door aan de constructor.

Als u het gedrag van de toepassing expliciet wilt beheren wanneer er een uitzondering optreedt of FaultException<TDetail> wordt gegenereerd, implementeert u de System.ServiceModel.Dispatcher.IErrorHandler interface op een System.ServiceModel.Description.IServiceBehaviorof System.ServiceModel.Description.IContractBehaviorSystem.ServiceModel.Description.IEndpointBehavior en wijst u deze toe aan de ChannelDispatcher.ErrorHandlers eigenschap. IErrorHandler hiermee kunt u expliciet de SOAP-fout beheren die wordt gegenereerd en of deze naar de client moet worden teruggestuurd.

Als u foutopsporing wilt vergemakkelijken, stelt u de ServiceBehaviorAttribute.IncludeExceptionDetailInFaults in true code in of kunt u het ServiceDebugBehavior.IncludeExceptionDetailInFaults in een toepassingsconfiguratiebestand gebruiken. Wanneer deze functie is ingeschakeld, retourneert de service automatisch uitzonderingsgegevens naar de aanroeper. Deze fouten worden aan de client als FaultException uitzonderingen weergegeven.

Important

Omdat beheerde uitzonderingen interne toepassingsinformatie kunnen blootgeven, kan het instellen van ServiceBehaviorAttribute.IncludeExceptionDetailInFaults of ServiceDebugBehavior.IncludeExceptionDetailInFaults naar true WCF-clients toestaan om informatie te verkrijgen over uitzonderingen van interne servicebewerkingen, waaronder persoonlijk identificeerbare of andere gevoelige informatie.

Daarom wordt het instellen van ServiceBehaviorAttribute.IncludeExceptionDetailInFaults of ServiceDebugBehavior.IncludeExceptionDetailInFaults op true alleen aanbevolen als een manier om tijdelijk fouten in een servicetoepassing op te sporen. Daarnaast bevat de WSDL voor een methode die op deze manier niet-verwerkte beheerde uitzonderingen retourneert, niet het contract voor het FaultException<TDetail> van type String. Clients moeten de mogelijkheid verwachten van een onbekende SOAP-fout (geretourneerd naar WCF-clients als System.ServiceModel.FaultException objecten) om de foutopsporingsgegevens correct te verkrijgen.

Constructors

Name Description
FaultContractAttribute(Type)

Initialiseert een nieuw exemplaar van de FaultContractAttribute klasse.

Eigenschappen

Name Description
Action

U haalt hiermee de actie op of stelt deze in van het SOAP-foutbericht dat is gespecificeerd als onderdeel van het operation contract.

DetailType

Hiermee haalt u het type van een serialiseerbare object op dat foutinformatie bevat.

HasProtectionLevel

Hiermee wordt een waarde opgehaald die aangeeft of aan het SOAP-foutbericht een beveiligingsniveau is toegewezen.

Name

Hiermee wordt de naam van het foutbericht in WSDL (Web Services Description Language) opgeslagen of ingesteld.

Namespace

Hiermee wordt de naamruimte van de SOAP-fout opgehaald of ingesteld.

ProtectionLevel

Hiermee geeft u het beveiligingsniveau op dat de SOAP-fout vereist van de binding.

TypeId

Wanneer deze wordt geïmplementeerd in een afgeleide klasse, krijgt u Attributehiervoor een unieke id.

(Overgenomen van Attribute)

Methoden

Name Description
Equals(Object)

Retourneert een waarde die aangeeft of dit exemplaar gelijk is aan een opgegeven object.

(Overgenomen van Attribute)
GetHashCode()

Retourneert de hash-code voor dit exemplaar.

(Overgenomen van Attribute)
GetType()

Hiermee haalt u de Type huidige instantie op.

(Overgenomen van Object)
IsDefaultAttribute()

Wanneer deze wordt overschreven in een afgeleide klasse, geeft u aan of de waarde van dit exemplaar de standaardwaarde is voor de afgeleide klasse.

(Overgenomen van Attribute)
Match(Object)

Wanneer deze wordt overschreven in een afgeleide klasse, wordt een waarde geretourneerd die aangeeft of dit exemplaar gelijk is aan een opgegeven object.

(Overgenomen van Attribute)
MemberwiseClone()

Hiermee maakt u een ondiepe kopie van de huidige Object.

(Overgenomen van Object)
ToString()

Retourneert een tekenreeks die het huidige object vertegenwoordigt.

(Overgenomen van Object)

Expliciete interface-implementaties

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

Hiermee wordt een set namen toegewezen aan een bijbehorende set verzend-id's.

(Overgenomen van Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Hiermee haalt u de typegegevens voor een object op, die kan worden gebruikt om de typegegevens voor een interface op te halen.

(Overgenomen van Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Hiermee wordt het aantal type-informatieinterfaces opgehaald dat een object biedt (0 of 1).

(Overgenomen van Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Biedt toegang tot eigenschappen en methoden die door een object worden weergegeven.

(Overgenomen van Attribute)

Van toepassing op