WCF入門-08。コントラクトを理解する。(サービスコントラクト、オペレーションコントラクト、データコントラクト、メッセージコントラクト、エラーコントラクト)

WCFでは、クライアントとサーバのインタフェースにあたる部分を「コントラクト」と呼んでいます。英語で「Contract」、日本語訳で「契約」です。クライアントとサーバ間での契約ということで、どのようなインタフェースで渡すかという取り決め。ということで、コントラクト。と呼ばれています。

オブジェクト指向の考え方でもインタフェースの事を「契約」と呼ぶ事があります。基本的に同じ意味で捉えて良いと思います。オブジェクトとオブジェクトの境界のメソッド名、引数の数、引数の型、戻り値の型、例外などです。

ということで、話をWCFに戻します。コントラクトには以下の4種類があります。

  • サービスコントラクト、オペレーションコントラクト(サービスのインタフェース及びそのメソッド。)
  • データコントラクト(サービスのパラメータ、戻り値のクラス)
  • メッセージコントラクト(サービスのパラメータ、戻り値のクラス。SOAPメッセージヘッダ用のクラス)
  • エラーコントラクト(サービスのメソッドが返す例外のクラス)

WCFが使うSOAPメッセージ自体を変更することが出来るメッセージコントラクトがありますが、SOAPメッセージレベルでのカスタマイズを行いたい場合にしか使わないので普段はあまり使う機能ではありません。必要になる事も少ないと思います。

上記の各種コントラクトの概略です。

  • サービスコントラクト、オペレーションコントラクト(サービスのインタフェース及びそのメソッド。)

サービスとして公開するインタフェースの属性として[System.ServiceModel.ServiceContract]、メソッドの属性として[System.ServiceModel.OperationContract]を付けます。


_
Public Interface ISampleService
_
Function HelloWCF(ByVal param As BasicParameter) As BasicResult
End Interface

  • データコントラクト(サービスのパラメータ、戻り値のクラス)

メソッドの引数の型、戻り値の型などデータとしてやり取りするクラスの属性として[System.Runtime.Serialization.DataContract]、メンバーの属性として[System.Runtime.Serialization.DataMember]を付けます。属性の名前空間を見て分かるようにデータを受け渡しする際のシリアライズ処理用の属性です。データコントラクトはSOAPメッセージシリアライズ用のXMLフォーマッタなのですが、SOAPメッセージボディに設定するデータに相互運用性の考慮の必要が無ければ[System.Serializable]でも問題はありません。通常のXMLフォーマッタやバイナリフォーマッタも使えます。


_
Public Class BasicParameter
_
Public Type As TypeEnum = TypeEnum.Text
_
Public Message As String = String.Empty
End Class

_
Public Class BasicResult
_
Public Result As ResultEnum = ResultEnum.Success
_
Public Message As String = String.Empty
End Class

  • メッセージコントラクト(サービスのパラメータ、戻り値のクラス。SOAPメッセージヘッダ用のクラス)

データコントラクト同様、メッセージコントラクトもサービスのパラメータや戻り値のクラスに属性を付けます。データコントラクトとの違いは、属性を付けたメンバーがSOAPメッセージヘッダとして処理される事です。クラスの属性として[System.ServiceModel.MessageContract]、メンバーの属性として[System.ServiceModel.MessageHeader]を付与します。


_
Public Class BasicParameter
_
Public Type As TypeEnum = TypeEnum.Text
_
Public Message As String = String.Empty
End Class

  • エラーコントラクト(サービスのメソッドが返す例外のクラス)

エラーコントラクトはサービスのメソッドに付ける属性で、そのメソッドを呼び出した際に発生する可能性がある例外のクラスを属性の引数として指定します。例外クラスは、WCFを通じてクライアントに送信されるのでデータコントラクト属性を付けてシリアライズ可能な状態に設定しておく必要があります。


_
Public Interface ISampleService
_
_
Function HelloWCF(ByVal param As BasicParameter) As BasicResult
End Interface

_
Public Class BasicFault
_
Public ErrorMessage As String = String.Empty
End Class