ものがたり(旧)

atsushieno.hatenablog.com に続く

基本的なクラス

WebChannelFactoryとWebServiceHost

もし普段クライアント側でChannelFactoryを使っているのなら、それをWebChannelFactoryに置き換えると、後述する WebHttpBehavior(IEndpointBehavior)を自動的に補完してくれる。自分で ServiceEndpoint.BehaviorsにWebHttpBehaviorを追加するなら、WebChannelFactoryは不要だ。

同様のことがWebServiceHost, WebServiceHostFactoryにも言える(WebHttpBehaviorを補完してくれるだけ)。

WebHttpBindingとWebMessageEncodingBindingElement

Bindingは基本的にBindingElementの組み合わせを生成するだけだ。WebHttpBindingも、 WebMessageEncodingBindingElementとHttpTransportBindingElementを生成するだけなので、もしこれを手作業でやってCustomBindingを生成するような人(他にinterceptorを挟んだりするような人)には、 WebHttpBindingは必要ない。

WebMessageEncodingBindingElementは、MessageEncoderを生成するために用いられるものである。その MessageEncoderは、MessageをHTTP GETのリクエストに変換したり、POSTするリクエストの内容をJSON文字列に変換したり、逆にサービスからのJSONレスポンスをMessageに変換したりするために用いられる。

WebGetAttributeとWebInvokeAttribute

これらはOperationContractとなるメソッドに追加されている必要がある。

これらはIOperationBehaviorを実装していて、IOperationBehaviorを実装するようなAttributeは、 ContractDescription.GetContract()が呼び出された時に、OperationContractとなるメソッドから OperationDescriptionを生成する時に、そのBehaviorsに自動的に追加される。*1

WebHttpBehavior

WebHttpBindingで最も重要なクラスはこれだ(と僕は断言する)。このクラスから、以下のものが生成される。また、これらを生成するメソッドはいずれもvirtualなので拡張可能である。

WebHttpDispatchOperationSelector
これはIDispatchOperationSelectorの実装で、あるendpointに到達したMessageが、どのOperationを呼び出しているのか、選択するために用いられる。
IClientMessageFormatter
クライアント側で、ランタイムメソッド呼び出しで渡されたCLR型のパラメータ群から、Messageを生成するために用いられる (SerializeRequest)。また、サービスから返ってきたMessageからランタイムメソッド呼び出しの結果をCLRオブジェクトとして生成するために用いられる(DeserializeReply)。
IDispatchMessageFormatter
サービス側で、Messageからサービスのランタイムメソッド呼び出しに必要なCLRオブジェクトを生成するために用いられる(DeserializeRequest)。また、ランタイムメソッド呼び出しの結果からMessageを生成するために用いられる(SerializeReply)。

*1:OperationContractとなるメソッドに属性として設定せずにOperationDescription.Behaviorsに手動で追加してちゃんと動くかどうかは分からない。