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. Em aplicativos WCF (Windows Communication Foundation), no entanto, os contratos de serviço especificam quais informações de erro são retornadas aos clientes declarando falhas SOAP no contrato de serviço. Para obter uma visão geral da relação entre exceções e falhas, consulte Especificando e tratando falhas em contratos e serviços.
Criar um contrato de serviço que especifique uma falha SOAP
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.
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 SOAP aos clientes, consulte Especificando e manipulando falhas em contratos e serviços.
Aplique a 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 Especificando a transferência de dados em contratos de serviço. O exemplo a seguir mostra como especificar que a
SampleMethod
operação pode resultar em umGreetingFault
arquivo .[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
Repita as etapas 2 e 3 para todas as operações no contrato que comunicam condições de erro aos clientes.
Implementando uma operação para retornar uma falha SOAP especificada
Depois que uma operação tiver especificado que uma falha SOAP específica pode ser retornada (como no procedimento anterior) para comunicar uma condição de erro a um aplicativo chamador, a próxima etapa é implementar essa especificação.
Lançar a falha SOAP especificada na operação
Quando uma FaultContractAttributecondição de erro especificada ocorre em uma operação, lance uma nova System.ServiceModel.FaultException<TDetail> em que a falha SOAP especificada é o parâmetro type. O exemplo a seguir mostra como lançar o
GreetingFault
SampleMethod
no 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 SampleMethod
operação.
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