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
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).
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.
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ćGreetingFault
wykonanie 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
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
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
wSampleMethod
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