次の方法で共有


方法 : サービス コントラクトでのエラーを宣言する

マネージ コードでは、エラー条件が発生すると例外がスローされます。しかし Windows Communication Foundation (WCF) アプリケーションでは、サービス コントラクトで SOAP エラーを宣言することにより、どのエラー情報をクライアントに通知するかを指定するようになっています。例外とエラーの関係の概要については、「コントラクトおよびサービスのエラーの指定と処理」を参照してください。

SOAP エラーを指定するサービス コントラクトを作成する

  1. サービス コントラクトを作成し、操作をいくつか定義します。例については、「方法 : Windows Communication Foundation サービス コントラクトを定義する」を参照してください。

  2. 操作を選択します。これに対して指定したエラー条件が発生したとき、クライアント側に通知することになります。どのようなエラー条件を SOAP エラーとしてクライアントに通知する必要があるかについては、「コントラクトおよびサービスのエラーの指定と処理」を参照してください。

  3. 選択した操作に対して 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
    
  4. コントラクト内でクライアントへの通知が必要な操作すべてについて、手順 2. および 3. を繰り返します。

指定した SOAP エラーを返す操作の実装

エラー状態を呼び出し元アプリケーションに通知するために、前の手順で指定したような特定の SOAP エラーを操作中に返せるように指定したので、次に実際に通知処理を実装します。

指定した SOAP エラーを操作中に例外としてスローする

  1. 操作中に 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