WCFの基礎の基礎を押さえよう。Foundation(以降、WCFと略す)と命名されたコミュニケーション基盤技術に関して、その登場の背景を中心に「なぜマイクロソフトは新しい通信インフラを提供することになったのか?」、また「そこにはどんな狙いがあるのか?」、さらには「そのテクノロジを採用するメリットは何なのか?」といったところを見てきた。今回はWCFの基本的な概念について解説する。多少、抽象的で分かりにくいかもしれないが、今回説明する個々の概念がよく理解できなくても、次回のプログラミング例までを併せて読み進めていただければ全体的に把握できるだろう。最後までお付き合いいただきたい。CTP段階)での内容であるため将来変更される可能性が十分あることをあらかじめご了承いただきたい。■“ABC”とはWCFの基本的な概念の中でも真っ先に理解しておくべきなのが“ABC”である。それでは、ABCとは何なのか。WCFでのアプリケーション間通信の様子を以下の図に描いてみた。WCFでのアプリケーション間通信クライアントとサービスのメッセージのやりとりを図示したもの。WCFにおけるアプリケーション間通信は、基本的にはサービスの提供者と利用者の2者の間で、おのおのが相互にメッセージを交換することで通信が成立する。ここでサービス提供者を「サービス」と呼ぶ場合もあれば、「サーバ」と呼ぶ場合もある。サービス利用者は「コーラー」(サービスを呼び出す側)と呼ぶ場合もあれば、単に「クライアント」と呼ぶ場合もある。注意していただきたいのは、WCFでの通信の場合、従来のクライアント/サーバといった単純な図式ばかりではないということ。ネットワーク上に分散したさまざまなコンポーネント(サービスとしてのインターフェイスを持つサービス・コンポーネント)間の相互接続形態においては、サーバ兼クライアントといった場合が多々あり得るからだ。ここでは話を単純化するために、クライアントとサービスといった表現で進めていく。クライアントとサービスが通信を行い、メッセージを交換することで分散アプリケーションが構成されていく。このときの双方のメッセージの出入り口に当たる端点となる部分を「エンドポイント」と呼んでいる。WCFにおいてまずはこのエンドポイントを定義する必要があるわけである。具体的にエンドポイントをどのように定義するかであるが、そこで“ABC”という概念が登場する。ABCとは、A:Address(アドレス)、B:Binding(バインディング)、C:Contract(コントラクト)の略称である。A:アドレス「Where」を意味し、どのアドレスに対してメッセージを送るのか、あるいはどのアドレスでメッセージを受けるのか、といった定義となる。B:バインディング「How」を意味し、どのようにメッセージを送るのか、あるいはメッセージを受けるのかを示す。具体的にはどのようなトランスポート・プロトコルで通信し、どのようなエンコーディングを採用するのか、といったような、どちらかというとトランスポート・プロトコル・レベルの定義となる。C:コントラクト「What」を意味し、何を交換するのか、を意味する。具体的にはほかに公開するサービスは何で(=サービス・コントラクト)、あるいは利用しようとするサービスは何で(=オペレーション・コントラクト)、そして交換するメッセージは何か(=データ・コントラクトもしくはメッセージ・コントラクト)を定義することになる。以上のABCの定義によってエンドポイントを構成し、クライアントおよびサービスが互いに通信する出入り口を確定することになるのである。この、ABCがWCFでサービスおよびクライアントを構築するときに必要となる重要な概念なのである。エンドポイントを構成するA、B、Cメッセージの出入り口に当たる部分であるエンドポイントはA、B、Cの3つの要素で構成される。A:Address(アドレス)は「Where」、B:Binding(バインディング)は「How」、C:Contract(コントラクト)は「What」に相当する。それではさらに具体的に、このABCそれぞれの内容について見ていこう。A:アドレス=「Where」まずはアドレスの定義であるが、先ほども述べたように、クライアントから見た場合、提供されているサービスのどのアドレスに対してメッセージを送るのか、あるいはサービスから見た場合、どのアドレスでメッセージを受けるのか、といった定義となる。アドレスの表現方法はWCFで標準的に対応しているトランスポート・プロトコルとして何を選択するかによって異なる。次の表はアドレスの定義方法の例である。プロトコルアドレスの指定例HTTPhttp://www.sample.com/MyService/HTTPShttps://www.sample.com:8000/MyService/TCPnet.tcp://www.sample.com:8000/MyService/Named-Pipenet.pipe://machine-name/MyService/MSMQnet.msmq://machine-name/private/MyQueues/トランスポート・プロトコル別のアドレスの指定例このようなアドレスの指定をコンフィグレーション・ファイルあるいはソース・コードで設定することになる。基本的には「プロトコルのスキーマ名://マシン名:ポート番号/サービスのパス/」といった形式となるが、Named-Pipe(=名前付きパイプ)とMSMQの場合はポート番号の指定は必要ない。B:バインディング=「How」バインディングの指定方法は、通常、用途別に標準で提供されている(プリセット済み)バインディング・セットの中から選択することで、使用するプロトコルおよびエンコーディングを選択するといった形を取ることが一般的である。標準的に提供されるバインディング・セットとしては次の表のものが挙げられる。標準のバインディング・セット名とその概要なお、このような標準セットで補い切れない場合はカスタム・バイディングという細かなパラメータをすべて個別に定義していく手法を取ることになる。それぞれのバインディング・セットで使用される下位のトランスポート・プロトコルやエンコーディングは下記のようになっている。Simplex標準のバインディング・セットごとの特徴Text/XML=テキスト形式XML。Mechanism)=バイナリ・データを含むSOAPメッセージ。標準で提供されているバインディングのセットから、要件にふさわしいものを選択した方が細かなパラメータ設定の煩雑さもないといえる。標準のバインディング・セットの選択基準であるが、おおむね以下の図のようになる。ほかのプラットフォームとの相互運用性を確保するかどうかで大きく2つに選択肢が分かれる。標準バインディング・セットの選択方法ほかのプラットフォームとの相互運用性を確保するかどうかで大きく2つに選択肢が分かれる。ここで若干補足しておきたいのだが、標準のバイディング・セットは1つのエンドポイントに対して1つ選択することになるが、1つのサービスには複数のエンドポイントを持たせることが可能だ。1.1準拠のエンドポイントを同時に持たせてもよいわけである。このように、エンドポイントは1つのサービスに対して用途別に複数同時に持たせることが可能である(下図)。エンドポイントは1つのサービスに対して複数定義可能エンドポイントは用途別に複数同時に持たせることが可能だ。次にコントラクトの定義を見ていこう。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。