Nyelv

FaultContractAttribute Osztály

Definíció

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
FaultContractAttribute
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.

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)

A következőre érvényes: