FaultContractAttribute Klass

Definition

Anger ett eller flera SOAP-fel som returneras när en tjänståtgärd påträffar bearbetningsfel.

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
Arv
FaultContractAttribute
Attribut

Exempel

Följande kodexempel visar användningen av FaultContractAttribute för att ange att SampleMethod åtgärden kan returnera ett SOAP-fel med detaljtypen 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

Följande kodexempel visar att WCF-klienter upplever ISampleService det här SOAP-felet som en FaultException<TDetail> av typen 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

Kommentarer

Markera en åtgärd med FaultContractAttribute attributet för att deklarera ett eller flera specifika undantagsvillkor som läggs till i WSDL-beskrivningen (Web Service Description Language) för tjänståtgärden som explicita SOAP-felmeddelanden som returneras av åtgärden.

I alla hanterade program representeras bearbetningsfel av Exception objekt. I SOAP-baserade program som Windows Communication Foundation-program (WCF) kommunicerar tjänstmetoder bearbetning av felinformation med hjälp av SOAP-felmeddelanden. Eftersom WCF-program körs under båda typerna av felsystem måste all hanterad undantagsinformation som måste skickas till klienten konverteras från undantag till SOAP-fel. Du kan använda standardbeteenden för tjänstfel, eller så kan du uttryckligen styra om - och hur - undantag mappas till felmeddelanden. En översikt över undantag och SOAP-fel i WCF-program finns i Ange och hantera fel i kontrakt och tjänster.

Vi rekommenderar att tjänståtgärderna använder FaultContractAttribute för att formellt ange alla SOAP-fel som en klient kan förvänta sig att ta emot under en normal åtgärd. Vi rekommenderar också att endast den information som en klient måste känna till returneras i ett SOAP-fel för att minimera avslöjandet av information.

  • Egenskapen Action styr åtgärden för felmeddelandet.

  • Egenskapen DetailType hämtar den typ av detaljobjekt som serialiseras i felmeddelandet.

  • Egenskaperna Name och Namespace styr namn respektive namnrymd för felmeddelandet.

  • HasProtectionLevel Anger om felmeddelandet har en angiven skyddsnivå, och i så fall styr egenskapen den ProtectionLevel skyddsnivån.

Caution

Om ett felmeddelande innehåller information som är känslig eller kan leda till säkerhetsproblem rekommenderar vi starkt att egenskapen ProtectionLevel anges.

För många scenarier räcker det med att EncryptAndSign ange ProtectionLevel för felmeddelanden. Mer information finns i Förstå skyddsnivå.

Om du vill returnera ett angivet fel från en åtgärd markerad med FaultContractAttributegenererar du en FaultException<TDetail> (där typparametern är den serialiserbara felinformationen) när det hanterade undantaget inträffar under åtgärden. WCF-klientprogram visar SOAP-felet som samma typ som utlöstes i klientimplementeringen, det vill ex. som en FaultException<TDetail> (där typeparametern är den serialiserbara felinformationen). FaultContractAttribute Kan endast användas för att ange SOAP-fel för tvåvägstjänståtgärder och för asynkrona åtgärdspar. Enkelriktade åtgärder stöder inte SOAP-fel och stöder FaultContractAttributedärför inte .

Note

Du kan använda valfri serialiserbar typ för att förmedla felinformation. Den enda begränsningen i den här versionen av WCF är att typer som anges i en FaultContractAttribute måste serialiseras av System.Runtime.Serialization.DataContractSerializer. Det serialiseringsstöd som DataContractSerializer tillhandahåller finns i Data Contract Serializer.

Om du till exempel vill ange att klienter kan förvänta sig ett SOAP-fel som innehåller en Int32, placerar du den typen av parameter i FaultContractAttribute på tjänstmetoden.

Note

Följande kodexempel anger ProtectionLevelinte egenskaperna , Nameeller Namespace .

[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

I tjänstmetoden genererar du sedan en ny FaultException<TDetail> där typparametern är den typ som innehåller felinformationen (i ovanstående fall en Int32). Ett exempel:

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

Föregående exempel är mycket grundläggande; nästan all information kan skickas med hjälp av en System.Int32 kod, så den här detaljtypen är inte den mest användbara. Vanligtvis anger WCF-program SOAP-fel med detaljtyper som är specifika för klientens felinformationskrav. Ett mer komplett exempel finns i avsnittet Exempel.

Note

Om du anger en FaultException<TDetail> där typparametern är en System.Stringtilldelas strängvärdet till egenskapen Detail i klientprogrammet. Klienter kan inte hämta strängen FaultException<TDetail>.ToString genom att anropa metoden. Om du vill att strängvärdet ska returneras när klientprogrammet anropar Exception.ToStringgenererar du ett System.ServiceModel.FaultException undantag i åtgärden och skickar strängen till konstruktorn.

Om du uttryckligen vill styra programmets beteende när ett undantag eller FaultException<TDetail> utlöses implementerar System.ServiceModel.Dispatcher.IErrorHandler du gränssnittet på en System.ServiceModel.Description.IServiceBehavior, System.ServiceModel.Description.IContractBehavior eller System.ServiceModel.Description.IEndpointBehavior och tilldelar det till ChannelDispatcher.ErrorHandlers egenskapen. IErrorHandler gör att du uttryckligen kan kontrollera SOAP-felet som genereras och om du vill skicka tillbaka det till klienten.

För att underlätta felsökning anger du ServiceBehaviorAttribute.IncludeExceptionDetailInFaults till true i kod eller så kan du använda ServiceDebugBehavior.IncludeExceptionDetailInFaults i en programkonfigurationsfil. När den är aktiverad returnerar tjänsten automatiskt undantagsinformation till anroparen. Dessa fel visas för klienten som FaultException undantag.

Important

Eftersom hanterade undantag kan exponera intern programinformation, kan inställning ServiceBehaviorAttribute.IncludeExceptionDetailInFaults eller ServiceDebugBehavior.IncludeExceptionDetailInFaults till true tillåta WCF-klienter att hämta information om interna tjänståtgärdsfel, inklusive personligt identifierbar eller annan känslig information.

Därför rekommenderas det att man sätter ServiceBehaviorAttribute.IncludeExceptionDetailInFaults eller ServiceDebugBehavior.IncludeExceptionDetailInFaults till true endast som ett sätt att tillfälligt felsöka ett tjänstprogram. Dessutom innehåller WSDL för en metod som returnerar ohanterade undantag på det här sättet inte kontraktet för FaultException<TDetail> av typen String. Klienter måste förvänta sig risken för ett okänt SOAP-fel (returneras till WCF-klienter som System.ServiceModel.FaultException objekt) för att få felsökningsinformationen korrekt.

Konstruktorer

Name Description
FaultContractAttribute(Type)

Initierar en ny instans av FaultContractAttribute klassen.

Egenskaper

Name Description
Action

Hämtar eller anger åtgärden för SOAP-felmeddelandet som anges som en del av åtgärdskontraktet.

DetailType

Hämtar typen av ett serialiserbart objekt som innehåller felinformation.

HasProtectionLevel

Hämtar ett värde som anger om SOAP-felmeddelandet har en tilldelad skyddsnivå.

Name

Hämtar eller anger namnet på felmeddelandet i Web Services Description Language (WSDL).

Namespace

Hämtar eller anger namnområdet för SOAP-felet.

ProtectionLevel

Anger den skyddsnivå som SOAP-felet kräver från bindningen.

TypeId

När den implementeras i en härledd klass hämtar du en unik identifierare för den här Attribute.

(Ärvd från Attribute)

Metoder

Name Description
Equals(Object)

Returnerar ett värde som anger om den här instansen är lika med ett angivet objekt.

(Ärvd från Attribute)
GetHashCode()

Returnerar hash-koden för den här instansen.

(Ärvd från Attribute)
GetType()

Hämtar den aktuella instansen Type .

(Ärvd från Object)
IsDefaultAttribute()

När den åsidosättas i en härledd klass anger du om värdet för den här instansen är standardvärdet för den härledda klassen.

(Ärvd från Attribute)
Match(Object)

När den åsidosätts i en härledd klass returneras ett värde som anger om den här instansen är lika med ett angivet objekt.

(Ärvd från Attribute)
MemberwiseClone()

Skapar en ytlig kopia av den aktuella Object.

(Ärvd från Object)
ToString()

Returnerar en sträng som representerar det aktuella objektet.

(Ärvd från Object)

Explicita gränssnittsimplementeringar

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

Mappar en uppsättning namn till en motsvarande uppsättning av sändningsidentifierare.

(Ärvd från Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Hämtar typinformationen för ett objekt, som kan användas för att hämta typinformationen för ett gränssnitt.

(Ärvd från Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Hämtar antalet typinformationsgränssnitt som ett objekt tillhandahåller (antingen 0 eller 1).

(Ärvd från Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Ger åtkomst till egenskaper och metoder som exponeras av ett objekt.

(Ärvd från Attribute)

Gäller för