Vorgehensweise: Deklarieren von Fehlern in DienstverträgenHow to: Declare Faults in Service Contracts

In verwaltetem Code werden Ausnahmen bei Auftreten von Fehlerbedingungen ausgelöst.In managed code, exceptions are thrown when error conditions occur. Im Gegensatz dazu werden in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)-Anwendungen mittels Dienstverträgen die an Clients zurückzugebenden Fehlerinformationen angegeben. Zu diesem Zweck werden SOAP-Fehler in den Dienstverträgen deklariert.In Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) applications, however, service contracts specify what error information is returned to clients by declaring SOAP faults in the service contract. Eine Übersicht über die Beziehung zwischen den Ausnahmen und Fehlern, finden Sie unter angeben und Behandeln von Fehlern in Verträgen und Diensten.For an overview of the relationship between exceptions and faults, see Specifying and Handling Faults in Contracts and Services.

Erstellen eines Dienstvertrags zum Angeben eines SOAP-FehlersCreate a service contract that specifies a SOAP fault

  1. Erstellen Sie einen Dienstvertrag, der mindestens einen Vorgang enthält.Create a service contract that contains at least one operation. Ein Beispiel finden Sie unter wie: Definieren eines Dienstvertrags.For an example, see How to: Define a Service Contract.

  2. Wählen Sie einen Vorgang aus, der sich zum Angeben einer Fehlerbedingung eignet, aufgrund derer die Clients eine entsprechende Benachrichtigung erhalten.Select an operation that can specify an error condition about which clients can expect to be notified. Um zu entscheiden, welche fehlerbedingungen zu rechtfertigen, SOAP-Fehler an Clients zurückgegeben, finden Sie unter angeben und Behandeln von Fehlern in Verträgen und Diensten.To decide which error conditions justify returning SOAP faults to clients, see Specifying and Handling Faults in Contracts and Services.

  3. Wenden Sie ein System.ServiceModel.FaultContractAttribute auf den ausgewählten Vorgang an, und geben Sie einen serialisierbaren Fehlertyp an den Konstruktor weiter.Apply a System.ServiceModel.FaultContractAttribute to the selected operation and pass a serializable fault type to the constructor. Informationen zum Erstellen und Verwenden von serialisierbaren Typen finden Sie unter angeben von Datenübertragung in Dienstverträgen.For details about creating and using serializable types, see Specifying Data Transfer in Service Contracts. Im folgenden Beispiel wird gezeigt, wie angegeben werden kann, dass der SampleMethod-Vorgang zu einem GreetingFault führt.The following example shows how to specify that the SampleMethod operation can result in a GreetingFault.

    [OperationContract]
    [FaultContractAttribute(
      typeof(GreetingFault),
      Action="http://www.contoso.com/GreetingFault",
      ProtectionLevel=ProtectionLevel.EncryptAndSign
      )]
    string SampleMethod(string msg);
    
    <OperationContract, FaultContractAttribute(GetType(GreetingFault), Action:="http://www.contoso.com/GreetingFault", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
    Function SampleMethod(ByVal msg As String) As String
    
  4. Wiederholen Sie die Schritte2 und 3 für alle Vorgänge des Vertrags, durch die Fehlerbedingungen an Clients weitergegeben werden.Repeat steps 2 and 3 for all operations in the contract that communicate error conditions to clients.

Implementieren eines Vorgangs für das Zurückgeben eines angegebenen SOAP-FehlersImplementing an Operation to Return a Specified SOAP Fault

Nachdem für einen Vorgang angegeben wurde, dass ein bestimmter SOAP-Fehler zurückgegeben werden kann, um eine Fehlerbedingung an eine aufrufende Anwendung weiterzugeben (wie beispielsweise in der vorangehenden Prozedur beschrieben), besteht der nächste Schritt in der Implementierung dieser Angabe.Once an operation has specified that a specific SOAP fault can be returned (such as in the preceding procedure) to communicate an error condition to a calling application, the next step is to implement that specification.

Auslösen des angegebenen SOAP-Fehlers im VorgangThrow the specified SOAP fault in the operation

  1. Tritt in einem Vorgang eine durch FaultContractAttribute angegebene Fehlerbedingung auf, lösen Sie eine neue System.ServiceModel.FaultException<TDetail> aus. Der angegebene SOAP-Fehler fungiert hierbei als Typparameter.When a FaultContractAttribute-specified error condition occurs in an operation, throw a new System.ServiceModel.FaultException<TDetail> where the specified SOAP fault is the type parameter. Im folgenden Beispiel wird gezeigt, wie der GreetingFault in der im vorherigen Abschnitt gezeigten SampleMethod sowie im folgenden Codeabschnitt ausgelöst werden kann.The following example shows how to throw the GreetingFault in the SampleMethod shown in the preceding procedure and in the following Code section.

    throw new FaultException<GreetingFault>(new GreetingFault("A Greeting error occurred. You said: " + msg));
    
      Throw New FaultException(Of GreetingFault)(New GreetingFault("A Greeting error occurred. You said: " & msg))
    End If
    

BeispielExample

Das folgende Codebeispiel zeigt die Implementierung eines Einzelvorgangs, durch den ein GreetingFault für den SampleMethod-Vorgang angegeben wird.The following code example shows an implementation of a single operation that specifies a GreetingFault for the SampleMethod operation.

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

Siehe auchSee Also

System.ServiceModel.FaultContractAttribute
System.ServiceModel.FaultException<TDetail>