Vorgehensweise: Deklarieren von Fehlern in Dienstverträgen

In verwaltetem Code werden Ausnahmen bei Auftreten von Fehlerbedingungen ausgelöst. Im Gegensatz dazu werden in 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. Eine Übersicht über die Beziehung zwischen Ausnahmen und Fehlern finden Sie unter Angeben und Behandeln von Fehlern in Verträgen und Diensten.

Erstellen eines Dienstvertrags zum Angeben eines SOAP-Fehlers

  1. Erstellen Sie einen Dienstvertrag, der mindestens einen Vorgang enthält. Ein Beispiel finden Sie unter Vorgehensweise: Einen Dienstvertrag definieren.

  2. Wählen Sie einen Vorgang aus, der sich zum Angeben einer Fehlerbedingung eignet, aufgrund derer die Clients eine entsprechende Benachrichtigung erhalten. Informationen dazu, welche Fehlerbedingungen das Zurückgeben von SOAP-Fehlern an Clients rechtfertigen, finden Sie unter Angeben und Behandeln von Fehlern in Verträgen und Diensten.

  3. Wenden Sie ein System.ServiceModel.FaultContractAttribute auf den ausgewählten Vorgang an, und geben Sie einen serialisierbaren Fehlertyp an den Konstruktor weiter. Ausführliche Informationen zum Erstellen und Verwenden serialisierbarer Typen finden Sie unter Angeben der Datenübertragung in Dienstverträgen. Im folgenden Beispiel wird gezeigt, wie angegeben werden kann, dass der SampleMethod-Vorgang zu einem GreetingFault führt.

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

Implementieren eines Vorgangs für das Zurückgeben eines angegebenen SOAP-Fehlers

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.

Auslösen des angegebenen SOAP-Fehlers im Vorgang

  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. Im folgenden Beispiel wird gezeigt, wie der GreetingFault in der im vorherigen Abschnitt gezeigten SampleMethod sowie im folgenden Codeabschnitt ausgelöst werden kann.

    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
    

Beispiel

Das folgende Codebeispiel zeigt die Implementierung eines Einzelvorgangs, durch den ein GreetingFault für den SampleMethod-Vorgang angegeben wird.

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

Siehe auch