Udostępnij za pośrednictwem


Deklarowanie błędów w kontraktach usługi

W kodzie zarządzanym wyjątki są zgłaszane, gdy wystąpią warunki błędu. Jednak w aplikacjach programu Windows Communication Foundation (WCF) kontrakty usług określają, jakie informacje o błędach są zwracane do klientów, deklarując błędy protokołu SOAP w kontrakcie usługi. Aby zapoznać się z omówieniem relacji między wyjątkami i błędami, zobacz Określanie i obsługa błędów w kontraktach i usługach.

Tworzenie kontraktu usługi określającego usterkę protokołu SOAP

  1. Utwórz kontrakt usługi zawierający co najmniej jedną operację. Aby zapoznać się z przykładem, zobacz How to: Define a Service Contract (Instrukcje: definiowanie kontraktu usługi).

  2. Wybierz operację, która może określać warunek błędu dotyczący tego, którzy klienci mogą oczekiwać powiadomienia. Aby zdecydować, które warunki błędu uzasadniają zwrócenie błędów protokołu SOAP do klientów, zobacz Określanie i obsługa błędów w kontraktach i usługach.

  3. System.ServiceModel.FaultContractAttribute Zastosuj element do wybranej operacji i przekaż do konstruktora typ błędu z możliwością serializacji. Aby uzyskać szczegółowe informacje na temat tworzenia i używania typów możliwych do serializacji, zobacz Określanie transferu danych w kontraktach usług. W poniższym przykładzie pokazano, jak określić, że SampleMethod operacja może spowodować GreetingFaultwykonanie operacji .

    [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. Powtórz kroki 2 i 3 dla wszystkich operacji w kontrakcie, które komunikują warunki błędu klientom.

Implementowanie operacji w celu zwrócenia określonego błędu PROTOKOŁU SOAP

Gdy operacja określi, że można zwrócić określony błąd protokołu SOAP (na przykład w poprzedniej procedurze), aby przekazać warunek błędu do aplikacji wywołującej, następnym krokiem jest zaimplementowanie tej specyfikacji.

Zgłaszanie określonego błędu protokołu SOAP w operacji

  1. FaultContractAttributeGdy w operacji wystąpi warunek -określony błąd, wyrzuć nowySystem.ServiceModel.FaultException<TDetail>, gdzie określony błąd SOAP jest parametrem typu. W poniższym przykładzie pokazano, jak zgłosić element GreetingFault w SampleMethod pokazanej w poprzedniej procedurze i w poniższej sekcji Kod.

    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
    

Przykład

Poniższy przykład kodu przedstawia implementację pojedynczej operacji, która określa GreetingFault dla SampleMethod operacji.

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

Zobacz też