FaultContractAttribute Klas
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
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
- 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.
Als u de ProtectionLevel binding expliciet instelt op of ProtectionLevel.SignProtectionLevel.EncryptAndSign, moet u een binding met beveiliging gebruiken die is ingeschakeld met behulp van de System.ServiceModel.SecurityMode eigenschap voor de binding of er wordt een uitzondering gegenereerd.
Als u een binding selecteert die beveiliging mogelijk maakt en u de ProtectionLevel eigenschap nergens op het contract instelt, worden alle toepassingsgegevens versleuteld en ondertekend.
Als u een binding selecteert waarvoor geen beveiliging is ingeschakeld (de beveiliging is bijvoorbeeld System.ServiceModel.BasicHttpBinding standaard uitgeschakeld) en de ProtectionLevel binding niet expliciet is ingesteld, worden geen van de toepassingsgegevens beveiligd.
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) |