Поделиться через


Практическое руководство. Объявление сбоев в контрактах служб

В управляемом коде исключения создаются в случае возникновения ошибки. Однако в приложениях Windows Communication Foundation (WCF) контракты служб указывают, какие сведения об ошибках возвращаются клиентам путем объявления ошибок SOAP в контракте службы. Общие сведения о связи между исключениями и сбоями см. в разделе "Указание и обработка ошибок в контрактах и службах".

Создайте контракт службы, в котором определяется ошибка SOAP

  1. Создайте контракт службы, который содержит как минимум одну операцию. Пример см. в разделе "Практическое руководство. Определение контракта службы".

  2. Выберите операцию, которая задает условие ошибки, о которой предполагается уведомить клиентов. Чтобы решить, какие условия ошибок оправдывают возврат ошибок SOAP клиентам, см. раздел "Указание и обработка ошибок" в контрактах и службах.

  3. Примените атрибут System.ServiceModel.FaultContractAttribute к выбранной операции и передайте в конструктор сериализуемый тип ошибки. Дополнительные сведения о создании и использовании сериализуемых типов см. в разделе "Указание передачи данных в контрактах служб". В следующем примере показано, как указать, что операция SampleMethod может возвращать 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. Повторите шаги 2 и 3 для всех операций контракта, которые могут передавать клиентам условия ошибок.

Реализация операции, возвращающей заданную ошибку SOAP

После задания операции, возвращающей конкретную ошибку SOAP (например, как в описанной выше процедуре) для передачи условия ошибки вызывающему приложения, необходимо реализовать соответствующую спецификацию.

Создайте заданную ошибку SOAP в операции

  1. Когда в операции возникает условие ошибки, задаваемое атрибутом FaultContractAttribute, создайте новое исключение System.ServiceModel.FaultException<TDetail>, где заданная ошибка SOAP является параметром типа. В следующих примерах кода демонстрируется, как создать ошибку GreetingFault в методе SampleMethod, показанном в описанной выше процедуре и в следующем разделе Code.

    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
    

Пример

В следующем примере кода показана реализация одной операции, которая задает ошибку GreetingFault для операции SampleMethod.

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

См. также