Delen via


Procedure: Fouten in servicecontracten declareren

In beheerde code worden uitzonderingen gegenereerd wanneer er foutvoorwaarden optreden. In WCF-toepassingen (Windows Communication Foundation) wordt echter aangegeven welke foutinformatie aan clients wordt geretourneerd door SOAP-fouten in het servicecontract te declareren. Zie Fouten opgeven en afhandelen in contracten en services voor een overzicht van de relatie tussen uitzonderingen en fouten.

Een servicecontract maken waarmee een SOAP-fout wordt opgegeven

  1. Maak een servicecontract dat ten minste één bewerking bevat. Zie Een voorbeeld: Een servicecontract definiëren.

  2. Selecteer een bewerking waarmee een foutvoorwaarde kan worden opgegeven over welke clients een melding kunnen verwachten. Als u wilt bepalen welke foutvoorwaarden het retourneren van SOAP-fouten aan clients rechtvaardigen, raadpleegt u Het opgeven en verwerken van fouten in contracten en services.

  3. Pas een System.ServiceModel.FaultContractAttribute op de geselecteerde bewerking toe en geef een serialiseerbare fouttype door aan de constructor. Zie Gegevensoverdracht opgeven in servicecontracten voor meer informatie over het maken en gebruiken van serialiseerbare typen. In het volgende voorbeeld ziet u hoe u opgeeft dat de SampleMethod bewerking kan resulteren in een 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. Herhaal stap 2 en 3 voor alle bewerkingen in het contract die foutvoorwaarden doorgeven aan clients.

Een bewerking implementeren om een opgegeven SOAP-fout te retourneren

Zodra een bewerking heeft opgegeven dat een specifieke SOAP-fout kan worden geretourneerd (zoals in de voorgaande procedure) om een foutvoorwaarde aan een aanroepende toepassing te communiceren, is de volgende stap het implementeren van die specificatie.

De opgegeven SOAP-fout in de bewerking gooien

  1. Wanneer een FaultContractAttribute-opgegeven foutvoorwaarde optreedt in een bewerking, genereert u een nieuwe System.ServiceModel.FaultException<TDetail> waarbij de opgegeven SOAP-fout de typeparameter is. In het volgende voorbeeld ziet u hoe u het GreetingFault in de SampleMethod voorgaande procedure en in de volgende codesectie kunt weggooien.

    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
    

Opmerking

In het volgende codevoorbeeld ziet u een implementatie van één bewerking die een GreetingFault voor de SampleMethod bewerking aangeeft.

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

Zie ook