B:Binding
「どのようにサービスを提供するか」を表すBはBinding(バインディング)の略で、データの表現形式を表します。
例えば、同じHTTPプロトコルを使用する中でも、SOAPベースのWebサービスとRESTベースのWebサービスとJSONベースのWebサービスでは、同じデータを異なる表現形式で表すことになります。つまり、AddressだけではHTTPプロトコルだ、ということしか分かりませんので、それに加えて、HTTPプロトコル上でどのようにデータを表現するか、を表すのがこのバインディングです。
WCFでは、次のようなバインディングが提供されています。
バインディング名 | 概要 |
netTcpBinding | TCP/IPを使用するバインディング |
basicHttpBinding | SOAPベースのWebサービスのBasic-Profileを使用するバインディング |
wsHttpBinding | Webサービス拡張仕様を使用するバインディング |
netNamedPipeBinding | 名前付きパイプを使用するバインディング |
netMsmqBinding | MSMQを使用してWCFコンポーネントと接続するためのバインディング |
webHttpBinding | RESTスタイルのWebサービスおよびJSONをサポートするWebプログラミングモデルのバインディング |
Visual Studio 2008でWCFを使ったプロジェクトを作成すると、SOAPベースのWebサービスを提供するbasicHttpBindingがデフォルトで使用されます。.NET Framework 3.5からサポートされたWebプログラミングモデルに対応するwebHttpBindingを使用すれば、RESTスタイルのWebサービスやJSONをサポートすることができます。
なお、Webプログラミングモデルを使用する場合にはセキュリティに関する注意点があります。
basicHttpBindingやwsHttpBindingなど、SOAPベースのBindingでは、WS-Securityを含むWS-*(Webサービス拡張仕様)に基づくセキュリティを使用することができます。しかし、SOAPを使用しないWebプログラミングモデルでは、SOAPヘッダーがないため、特別なセキュリティ情報を付加することができません。webHttpBindingを使ったWebプログラミングモデルの場合、AddressにHTTPSプロトコルを指定することで、暗号化のみを行うことができます。
C:Contract
「何をサービスとして提供するか」を表すCはContract(コントラクト)の略で、実際にWCFを介してやり取りするデータを定義します。
WCFのコントラクトには以下の2種類があります。
種類 | 概要 |
サービス・コントラクト | サービスを提供するクラス・インターフェイスの定義 |
データ・コントラクト | やり取りするデータについての定義 |
コントラクトは、サービスを定義した.NETのクラス・インターフェイスに対し、属性として付加します。ここで重要な点ですが、コントラクトは通信方式やデータの表現形式には依存せず、公開するクラス・インターフェイス・メソッド・データがどれであるのか、WCFに通知する役割を担っています。
今回のサンプルで使用するコントラクトを見てみましょう。最初はサービス・コントラクトですが、サービスを提供するIService1
インターフェイスにServiceContract
属性が、インターフェイス内の実際の操作を表すGetMessage
メソッドにOperationContact
属性がそれぞれ付加されています。WCFはServiceContract
属性の付加されたクラス・インターフェイスを、サービスとして公開するクラス・インターフェイスとして、OperationContract
属性の付加されたメソッドを実際のサービスとして認識し、外部に公開します。
[ServiceContract] public interface IService1 { [OperationContract] string GetMessage(string name); ・・・中略・・・ }
次に、データ・コントラクトを見てみましょう。int
やstring
といった、.NET Frameworkの基本データ型については、特に定義することなく使用することができますが、独自のクラスについては、データをどのように受け渡す必要があるのかをWCFに通知する必要があり、これをデータ・コントラクトと呼びます。データ・コントラクトもサービス・コントラクトと同様に属性として表現します。
以下のサンプルでは、独自のクラスであるAddressBookEntry
クラスにDataContract
属性が、受け渡す必要のあるデータであるId/Name
プロパティにDataMember
属性が付加されています。これにより、WCFはAddressBookEntry
クラスのインスタンスがやり取りされる際に、そこに含まれるデータを適正に受け渡すことができます。
[DataContract] public class AddressBookEntry { int id; string name; [DataMember] public int Id { get { return id; } set { id = value; } } [DataMember] public string Name { get { return name; } set { name = value; } } ・・・中略・・・
Bv:Behavior
サービスの細かな挙動を表すBvはBehavior(ビヘイビア)の略です。WCFサービスのサーバ・クライアントで共有する必要がない、細かな設定情報が含まれています。
複数のエンドポイントを含むサービス全体に対する設定を行う、サービス・ビヘイビアと、エンドポイントごとの設定を行う、エンドポイント・ビヘイビアが存在します。
E:Endpoint
EはEndpoint(エンドポイント)の略で、ここまで説明したABC(+Bv)で構成されるサービスの提供口、ソケットのような概念を表します。
WCFサービスを利用するクライアントは、このエンドポイントに対してサービスのリクエストを行います。つまり、
- 通信先としてAで指定されたアドレスに
- データ表現形式としてBで指定されたバインディングを使い
- サービスの定義としてCで指定されたコントラクトに基づいて
リクエストする、というわけです。
このエンドポイントはサービス内に複数持つことができ、同じコントラクトに基づいて、異なるアドレス(通信方式)や、異なるバインディングを持つエンドポイントを同時に提供することもできます。
WCFのホスティング
WCFはABC(+Bv)で構成されるエンドポイントをクライアントに向けて提供しますが、以下の2種類のホスティング形態を持っています。
- アプリケーションによるホスティング
- IISによるホスティング(開発時はVisual Studioの提供するASP.NET 開発サーバ)
アプリケーションによるホスティングでもHTTPベースのWebサービスを提供することができますが、一般的な用途を考え、本記事ではIISによるWebサービスのホスティングを使用します。
ABC(+Bv)の指定方法
エンドポイントを構成するABC(+Bv)のうち、C(コントラクト)については、ソースコード中に属性として記述することを既に解説しました。それ以外のAB(+Bv)については、以下の2種類の指定方法があります。
- ソースコードで指定
- XMLベースの設定ファイルで指定
後者のXMLベースの設定ファイルは、.NET標準の構成ファイル(WindowsアプリケーションではApp.config、Webアプリケーションの場合はWeb.config)を使用します。本記事ではIISによるホスティングを使用しますので、ABCはWeb.configファイルで設定します。
以下に実際の記述例を示します。
<configuration> ・・・中略・・・ <system.serviceModel> <services> <service behaviorConfiguration="WcfServiceTest.Service1Behavior"
name="WcfServiceTest.Service1"> <endpoint address="" binding="basicHttpBinding"
bindingConfiguration=""
name="" contract="WcfServiceTest.IService1" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="WcfServiceTest.Service1Behavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
中ほどにあるendpoint
要素のaddress/binding/contract
属性が、それぞれABCを指しています。
IISによるホスティングを使用する場合、アドレスはHTTPプロトコルベースで、IIS側で割り当てられます。ここではbinding
属性にSOAPベースのWebサービスであるbasicHttpBinding
を、contract
属性としてServiceContract
属性を付加した、先ほどのWcfServiceTest.IService1
インターフェイスを指定しています。
さて、前置きが非常に長くなりましたが、WCFの基本概念を押さえることができたでしょうか。WCFサービスのキーワードであるABCをしっかり押さえつつ、サンプル作成に入っていきましょう。