Compartilhar via


Como: declarar falhas em contratos de serviço

No código gerenciado, as exceções são lançadas quando ocorrem condições de erro. No entanto, em aplicativos WCF (Windows Communication Foundation), os contratos de serviço especificam quais informações de erro são retornadas aos clientes declarando falhas de SOAP no contrato de serviço. Para obter uma visão geral da relação entre exceções e falhas, consulte Especificar e tratar falhas em contratos e serviços.

Criar um contrato de serviço que especifica uma falha de SOAP

  1. Crie um contrato de serviço que contenha pelo menos uma operação. Para obter um exemplo, consulte Como definir um contrato de serviço.

  2. Selecione uma operação que possa especificar uma condição de erro sobre a qual os clientes podem esperar ser notificados. Para decidir quais condições de erro justificam o retorno de falhas de SOAP aos clientes, consulte Especificar e tratar falhas em contratos e serviços.

  3. Aplique um System.ServiceModel.FaultContractAttribute à operação selecionada e passe um tipo de falha serializável para o construtor. Para obter detalhes sobre como criar e usar tipos serializáveis, consulte Especificar a transferência de dados em contratos de serviço. O exemplo a seguir mostra como especificar que a operação SampleMethod pode resultar em um 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. Repita as etapas 2 e 3 para todas as operações no contrato que comunicam condições de erro aos clientes.

Implementar uma operação para retornar uma falha de SOAP especificada

Depois que uma operação especificar que uma falha de SOAP específica pode ser retornada (como no procedimento anterior) para comunicar uma condição de erro a um aplicativo de chamada, a próxima etapa é implementar essa especificação.

Gerar a falha de SOAP especificada na operação

  1. Quando uma condição de erro especificada por FaultContractAttribute ocorrer em uma operação, lance um novo System.ServiceModel.FaultException<TDetail> no local em que a falha de SOAP especificada é o parâmetro de tipo. O exemplo a seguir mostra como gerar o GreetingFault no SampleMethod mostrado no procedimento anterior e na seção Código a seguir.

    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
    

Exemplo

O exemplo de código a seguir mostra uma implementação de uma única operação que especifica um GreetingFault para a operação 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

Confira também