FaultContractAttribute Osztály
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Egy vagy több SOAP-hibát ad vissza, amikor egy szolgáltatásművelet feldolgozási hibákba ütközik.
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
- Öröklődés
- Attribútumok
Példák
Az alábbi példakód bemutatja, hogy a FaultContractAttribute művelet vissza tud-e adni egy SampleMethod SOAP hibát a GreetingFault részlettípussal.
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
Az alábbi példakód azt mutatja be, hogy a WCF-ügyfelek ISampleService ezt a SOAP-hibát típusként FaultException<TDetail>GreetingFaulttapasztalják.
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
Megjegyzések
Jelöljön meg egy műveletet azzal az FaultContractAttribute attribútummal, hogy deklaráljon egy vagy több konkrét kivételfeltételeket, amelyek hozzáadódnak a szolgáltatásművelet webszolgáltatás-leírási nyelvéhez (WSDL) a művelet által visszaadott explicit SOAP-hibaüzenetekként.
Minden felügyelt alkalmazásban a feldolgozási hibákat objektumok jelölik Exception . A SOAP-alapú alkalmazásokban, például a Windows kommunikációs alaprendszer (WCF)-alkalmazásokban a szolgáltatásmódszerek SOAP-hibaüzenetekkel közlik a feldolgozási hibainformációkat. Mivel a WCF-alkalmazások mindkét típusú hibarendszerben futnak, az ügyfélnek küldendő felügyelt kivételadatokat a kivételekből SOAP-hibákká kell konvertálni. Használhatja az alapértelmezett szolgáltatáskivételi viselkedéseket, vagy explicit módon szabályozhatja, hogy a -- és hogyan - kivételek a hibaüzenetekre vannak-e leképezve. A WCF-alkalmazások kivételeinek és SOAP-hibáinak áttekintéséért lásd: Szerződések és szolgáltatások hibáinak megadása és kezelése.
Javasoljuk, hogy a FaultContractAttribute szolgáltatásműveletekkel formálisan adja meg az összes OLYAN SOAP-hibát, amelyet az ügyfél a művelet normál során kaphat. Azt is javasoljuk, hogy csak azokat az információkat adja vissza, amelyeket az ügyfélnek tudnia kell egy SOAP-hibában, hogy minimalizálja az információk közzétételét.
A Action tulajdonság szabályozza a hibaüzenet működését.
A DetailType tulajdonság a hibaüzenetben szerializált részletes objektum típusát kapja meg.
Name A Namespace tulajdonságok a hibaüzenet nevét és névterét szabályozzák.
Ez HasProtectionLevel azt jelzi, hogy a hibaüzenet rendelkezik-e megadott védelmi szinttel, és ha igen, akkor a tulajdonság szabályozza ezt a ProtectionLevel védelmi szintet.
Figyelmeztetés
Ha egy hibaüzenet bizalmas információkat tartalmaz, vagy biztonsági problémákhoz vezethet, javasoljuk, hogy állítsa be a ProtectionLevel tulajdonságot.
Ha explicit módon valamelyikre ProtectionLevelProtectionLevel.Signállítja a ProtectionLevel.EncryptAndSign kötést, akkor olyan kötést kell használnia, amely engedélyezve van a System.ServiceModel.SecurityMode kötés tulajdonságával, vagy kivételt eredményez.
Ha olyan kötést választ, amely lehetővé teszi a biztonságot, és nem állítja be a ProtectionLevel tulajdonságot bárhol a szerződésben, minden alkalmazásadat titkosítva és aláírva lesz.
Ha olyan kötést választ ki, amelynek nincs engedélyezve a biztonsága (például alapértelmezés szerint a System.ServiceModel.BasicHttpBinding biztonság le van tiltva), és az ProtectionLevel nincs explicit módon beállítva, akkor az alkalmazásadatok egyike sem lesz védett.
Sok esetben elegendő a hibaüzenetek beállítása ProtectionLevelEncryptAndSign . További részletekért lásd: A védelmi szint ismertetése.
Ha egy megadott hibát szeretne visszaadni egy megjelölt műveletből FaultContractAttribute, dobjon egy FaultException<TDetail> (ahol a típusparaméter a szerializálható hibainformáció), amikor a művelet során a felügyelt kivétel történik. A WCF-ügyfélalkalmazások a SOAP-hibát ugyanúgy kezelik, FaultException<TDetail> mint az ügyfél-implementációban , vagyis (ahol a típusparaméter a szerializálható hibainformáció). Ez csak a kétirányú szolgáltatásműveletek ÉS az aszinkron műveleti párok SOAP-hibáinak megadására használható. Az FaultContractAttribute egyirányú műveletek nem támogatják a SOAP-hibákat, ezért nem támogatják FaultContractAttributea .
Note
Bármilyen szerializálható típust használhat a hibainformációk továbbításához. A WCF ezen verziójának egyetlen korlátozása, hogy a megadott típusoknak FaultContractAttribute szerializálhatónak kell lenniük a System.Runtime.Serialization.DataContractSerializer. A szerializálási támogatásról az DataContractSerializerAdatszerződés szerializálója című témakörben olvashat.
Ha például meg szeretné adni, hogy az ügyfelek olyan SOAP-hibát várjanak, amely tartalmaz egy Int32, hely típusú paramétert a FaultContractAttribute szolgáltatásmetódusban.
Note
Az alábbi példakód nem állítja be a , ProtectionLevelvagy Name tulajdonságokatNamespace.
[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
Ezután a szolgáltatási módszerben adjon meg egy újat FaultException<TDetail> , ahol a típusparaméter a hibainformációkat tartalmazó típus (a fenti esetben Int32a ). Például:
throw new FaultException<int>(4);
Throw New FaultException(Of Integer)(4)
Az előző példa nagyon egyszerű; szinte bármilyen információ átadható kóddal System.Int32 , így ez a részlettípus nem a legléremesebb. A WCF-alkalmazások általában olyan SOAP-hibákat határoznak meg, amelyek részletes típusai az ügyfél hibainformációs követelményeire vonatkoznak. A teljesebb példaért tekintse meg a Példa szakaszt.
Note
Ha megadja FaultException<TDetail> , hogy a típusparaméter hol található System.String, a sztring értéke az ügyfélalkalmazás Részlet tulajdonságához van rendelve; az ügyfelek a metódus meghívásával nem tudják lekérni ezt a FaultException<TDetail>.ToString sztringet. Ha vissza szeretné adni a sztringértéket az ügyfélalkalmazás hívásai Exception.ToStringsorán, hozzon létre egy kivételt System.ServiceModel.FaultException a műveleten belül, és adja át a sztringet a konstruktornak.
Ha explicit módon szeretné szabályozni az alkalmazás viselkedését kivétel vagy FaultException<TDetail> dobás esetén, implementálja a System.ServiceModel.Dispatcher.IErrorHandler felületet egy System.ServiceModel.Description.IServiceBehavior, System.ServiceModel.Description.IContractBehavior vagy System.ServiceModel.Description.IEndpointBehavior rendelje hozzá a ChannelDispatcher.ErrorHandlers tulajdonsághoz. IErrorHandler lehetővé teszi a létrehozott SOAP-hiba explicit vezérlését, és azt, hogy visszaküldi-e az ügyfélnek.
A hibakeresés megkönnyítéséhez állítsa be a ServiceBehaviorAttribute.IncludeExceptionDetailInFaultstrue kódot, vagy használhatja az ServiceDebugBehavior.IncludeExceptionDetailInFaults alkalmazáskonfigurációs fájlban. Ha engedélyezve van, a szolgáltatás automatikusan visszaadja a kivételadatokat a hívónak. Ezek a hibák kivételként jelennek meg az ügyfél számára FaultException .
Important
Mivel a felügyelt kivételek közzétehetik a belső alkalmazásadatokat, a ServiceBehaviorAttribute.IncludeExceptionDetailInFaults vagy ServiceDebugBehavior.IncludeExceptionDetailInFaultstrue-re való beállítása lehetővé teheti, hogy a WCF-ügyfelek információhoz jussanak a belső szolgáltatás működési kivételekről, beleértve a személyesen azonosítható vagy más bizalmas információkat is.
Ezért a ServiceBehaviorAttribute.IncludeExceptionDetailInFaults vagy ServiceDebugBehavior.IncludeExceptionDetailInFaultstrue beállítása csak a szolgáltatásalkalmazások ideiglenes hibakeresésének eszközeként javasolt. Ezenkívül egy olyan metódus WSDL definíciója, amely így kezeletlen, felügyelt kivételeket ad vissza, nem tartalmazza a FaultException<TDetail> típus String szerződését. Az ügyfeleknek egy ismeretlen SOAP-hiba (a WCF-ügyfeleknek objektumként System.ServiceModel.FaultException visszaadott) lehetőségére kell számítaniuk a hibakeresési információk megfelelő beszerzéséhez.
Konstruktorok
| Név | Description |
|---|---|
| FaultContractAttribute(Type) |
Inicializálja a FaultContractAttribute osztály új példányát. |
Tulajdonságok
| Név | Description |
|---|---|
| Action |
Lekéri vagy beállítja a SOAP hibaüzenet akcióját, amely a szolgáltatási szerződés részeként van megadva. |
| DetailType |
Lekéri a hibainformációkat tartalmazó szerializálható objektum típusát. |
| HasProtectionLevel |
Beolvas egy értéket, amely jelzi, hogy a SOAP-hibaüzenethez hozzárendelt védelmi szint van-e hozzárendelve. |
| Name |
Lekéri vagy beállítja a hibaüzenet nevét a Web Services Description Language (WSDL) alkalmazásban. |
| Namespace |
Lekéri vagy beállítja a SOAP-hiba névterét. |
| ProtectionLevel |
Meghatározza a SOAP-hiba által a kötéstől megkövetelt védelmi szintet. |
| TypeId |
Ha származtatott osztályban implementálják, ehhez egy egyedi azonosítót Attributekap. (Öröklődés forrása Attribute) |
Metódusok
| Név | Description |
|---|---|
| Equals(Object) |
Olyan értéket ad vissza, amely jelzi, hogy ez a példány egyenlő-e egy adott objektummal. (Öröklődés forrása Attribute) |
| GetHashCode() |
A példány kivonatkódját adja vissza. (Öröklődés forrása Attribute) |
| GetType() |
Lekéri az Type aktuális példányt. (Öröklődés forrása Object) |
| IsDefaultAttribute() |
Ha egy származtatott osztályban felül van bírálva, azt jelzi, hogy a példány értéke-e a származtatott osztály alapértelmezett értéke. (Öröklődés forrása Attribute) |
| Match(Object) |
Származtatott osztály felülírásakor egy olyan értéket ad vissza, amely jelzi, hogy ez a példány egy adott objektummal egyenlő-e. (Öröklődés forrása Attribute) |
| MemberwiseClone() |
Az aktuális Objectpéldány sekély másolatát hozza létre. (Öröklődés forrása Object) |
| ToString() |
Az aktuális objektumot jelképező sztringet ad vissza. (Öröklődés forrása Object) |
Explicit interfész-implementációk
| Név | Description |
|---|---|
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Névkészletet képez le a küldési azonosítók megfelelő készletére. (Öröklődés forrása Attribute) |
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Lekéri egy objektum típusadatait, amelyek a felület típusadatainak lekérésére használhatók. (Öröklődés forrása Attribute) |
| _Attribute.GetTypeInfoCount(UInt32) |
Lekéri az objektumok által biztosított típusinformációs felületek számát (0 vagy 1). (Öröklődés forrása Attribute) |
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Hozzáférést biztosít az objektumok által közzétett tulajdonságokhoz és metódusokhoz. (Öröklődés forrása Attribute) |