Procedure: Fouten in servicecontracten declareren
In beheerde code worden uitzonderingen gegenereerd wanneer er foutvoorwaarden optreden. In WCF-toepassingen (Windows Communication Foundation) wordt echter aangegeven welke foutinformatie aan clients wordt geretourneerd door SOAP-fouten in het servicecontract te declareren. Zie Fouten opgeven en afhandelen in contracten en services voor een overzicht van de relatie tussen uitzonderingen en fouten.
Een servicecontract maken waarmee een SOAP-fout wordt opgegeven
Maak een servicecontract dat ten minste één bewerking bevat. Zie Een voorbeeld: Een servicecontract definiëren.
Selecteer een bewerking waarmee een foutvoorwaarde kan worden opgegeven over welke clients een melding kunnen verwachten. Als u wilt bepalen welke foutvoorwaarden het retourneren van SOAP-fouten aan clients rechtvaardigen, raadpleegt u Het opgeven en verwerken van fouten in contracten en services.
Pas een System.ServiceModel.FaultContractAttribute op de geselecteerde bewerking toe en geef een serialiseerbare fouttype door aan de constructor. Zie Gegevensoverdracht opgeven in servicecontracten voor meer informatie over het maken en gebruiken van serialiseerbare typen. In het volgende voorbeeld ziet u hoe u opgeeft dat de
SampleMethod
bewerking kan resulteren in eenGreetingFault
.[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
Herhaal stap 2 en 3 voor alle bewerkingen in het contract die foutvoorwaarden doorgeven aan clients.
Een bewerking implementeren om een opgegeven SOAP-fout te retourneren
Zodra een bewerking heeft opgegeven dat een specifieke SOAP-fout kan worden geretourneerd (zoals in de voorgaande procedure) om een foutvoorwaarde aan een aanroepende toepassing te communiceren, is de volgende stap het implementeren van die specificatie.
De opgegeven SOAP-fout in de bewerking gooien
Wanneer een FaultContractAttribute-opgegeven foutvoorwaarde optreedt in een bewerking, genereert u een nieuwe System.ServiceModel.FaultException<TDetail> waarbij de opgegeven SOAP-fout de typeparameter is. In het volgende voorbeeld ziet u hoe u het
GreetingFault
in deSampleMethod
voorgaande procedure en in de volgende codesectie kunt weggooien.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
Opmerking
In het volgende codevoorbeeld ziet u een implementatie van één bewerking die een GreetingFault
voor de SampleMethod
bewerking aangeeft.
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