基本的なクラス
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に手動で追加してちゃんと動くかどうかは分からない。