方法 : サービス コントラクトでのエラーを宣言する
マネージ コードでは、エラー条件が発生すると例外がスローされます。しかし Windows Communication Foundation (WCF) アプリケーションでは、サービス コントラクトで SOAP エラーを宣言することにより、どのエラー情報をクライアントに通知するかを指定するようになっています。例外とエラーの関係の概要については、「コントラクトおよびサービスのエラーの指定と処理」を参照してください。
SOAP エラーを指定するサービス コントラクトを作成する
サービス コントラクトを作成し、操作をいくつか定義します。例については、「方法 : Windows Communication Foundation サービス コントラクトを定義する」を参照してください。
操作を選択します。これに対して指定したエラー条件が発生したとき、クライアント側に通知することになります。どのようなエラー条件を SOAP エラーとしてクライアントに通知する必要があるかについては、「コントラクトおよびサービスのエラーの指定と処理」を参照してください。
選択した操作に対して System.ServiceModel.FaultContractAttribute 属性を適用し、シリアル化可能なエラー型をコンストラクターに渡します。シリアル化可能な型の作成方法および使用方法の詳細については、「サービス コントラクトでのデータ転送の指定」を参照してください。
SampleMethod
操作でGreetingFault
を返せるように指定する例を次に示します。<OperationContract, FaultContractAttribute(GetType(GreetingFault), Action:="https://www.contoso.com/GreetingFault", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _ Function SampleMethod(ByVal msg As String) As String
コントラクト内でクライアントへの通知が必要な操作すべてについて、手順 2. および 3. を繰り返します。
指定した SOAP エラーを返す操作の実装
エラー状態を呼び出し元アプリケーションに通知するために、前の手順で指定したような特定の SOAP エラーを操作中に返せるように指定したので、次に実際に通知処理を実装します。
指定した SOAP エラーを操作中に例外としてスローする
操作中に FaultContractAttribute で指定したエラー条件が発生したとき、System.ServiceModel.FaultException 例外を生成してスローする、というコードを記述します。SOAP エラーは型パラメーターとして、生成する例外に渡します。前の手順で示した
SampleMethod
内でGreetingFault
例外をスローするコード例を次に示します。Throw New FaultException(Of GreetingFault)(New GreetingFault("A Greeting error occurred. You said: " & msg)) End If
例
SampleMethod
操作内で GreetingFault
エラーが発生した場合の処理を実装したコード例を次に示します。
Imports System
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:="https://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
参照
リファレンス
System.ServiceModel.FaultContractAttribute
System.ServiceModel.FaultException