Практическое руководство. Объявление сбоев в контрактах служб
В управляемом коде исключения создаются в случае возникновения ошибки. Однако в приложениях Windows Communication Foundation (WCF) контракты служб указывают, какие сведения об ошибках возвращаются клиентам путем объявления ошибок SOAP в контракте службы. Общие сведения о связи между исключениями и сбоями см. в разделе "Указание и обработка ошибок в контрактах и службах".
Создайте контракт службы, в котором определяется ошибка SOAP
Создайте контракт службы, который содержит как минимум одну операцию. Пример см. в разделе "Практическое руководство. Определение контракта службы".
Выберите операцию, которая задает условие ошибки, о которой предполагается уведомить клиентов. Чтобы решить, какие условия ошибок оправдывают возврат ошибок SOAP клиентам, см. раздел "Указание и обработка ошибок" в контрактах и службах.
Примените атрибут 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
Повторите шаги 2 и 3 для всех операций контракта, которые могут передавать клиентам условия ошибок.
Реализация операции, возвращающей заданную ошибку SOAP
После задания операции, возвращающей конкретную ошибку SOAP (например, как в описанной выше процедуре) для передачи условия ошибки вызывающему приложения, необходимо реализовать соответствующую спецификацию.
Создайте заданную ошибку SOAP в операции
Когда в операции возникает условие ошибки, задаваемое атрибутом 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