Chappell & Associatesの社長であるDavid Chappell氏(source)は、彼のホワイトペーパー『Understanding WCF Communication Options in the .NET Framework 3.5』(多様性への対応: .NET Framework 3.5におけるWCF通信のオプションを理解する(source)) で、Windows Communication Foundation (WCF) が提供するさまざまな通信形態を示している。
Windows Communication Foundation(source)は、分散システムを開発するときに必要とされるさまざまな通信に、単一のプログラミングモデルで対応できるようにしようとマイクロソフトが考案したものである。この一連のオプションの中には、プロセス間通信やピアツーピアネットワークなどが含まれる。これまで、1つの通信モデルには、それ専用のプログラミングモデルが存在していた。David Chappell氏は、「多くの種類の通信に対して1つの共通プログラミングモデルを提供することで、開発者はより効果的に多様性に対応することができます」と述べている。
彼のホワイトペーパーでは、最初に、多様性に対応するWCFの中心となる2つの考え方が説明されている。
当初から、WCFの作成者たちは、アプリケーションは多様な通信を必要とするものだと認識していました。また、新しい形の通信が必ず登場してくるということも認識していました。このような現実に対応するため、WCFは、さまざまな通信形態をサポートする汎用的なアーキテクチャを提供します。このアーキテクチャでは、チャネルとバインディングという2つの概念が重要になります[...]。
WCFの対話1つ1つは、メッセージ交換と考えることができる。メッセージは、本文と、そのトランスポートを含む任意の大きさのインフラストラクチャデータで構成される。既存の通信、および今後登場するであろう通信の多様な種類に対応するため、WCFではチャネルモデルが導入されている。各チャネルは、インフラストラクチャの特定の部分 (例えば、セキュリティや信頼性など) ごとに設けられている。1つの通信オプションのすべてのインフラストラクチャ要件に対応するには、事前定義のまたはカスタムのチャネルスタックが用いられる。
クライアント、サービス、またはその両方のいずれとして機能する場合でも、WCFを介して通信するすべてのソフトウェアは、1つまたは複数のチャネルに依存します。[...] WCFクライアントまたはサービスと、それが依存する通信メカニズムとの間に、複数のチャネルを含む1つのスタックが作成されます。このスタックの最も下に存在するチャネルは、常に同じ役割を果たします。つまり、送信されるメッセージを、そのメッセージを運ぶ (トランスポートする) ために使用する何らかのメカニズムに関連付けます。このため、この最下部に存在する要素は、トランスポートチャネルと呼ばれています。
WCFでは、チャネルスタックを簡単に構成し定義することができるようにバインディングが導入されている。
1つのバインディングを指定することにより、WCF クライアントまたはサービスは、特定の一連の通信動作を実装する1つのチャネルスタックを暗示的に作成します。[...] 特定のWCFインターフェイスによって定義されたサービスは、1つのバインディングから、または同時に複数のバインディングからアクセスすることが可能です。
After explaining the architecture David Chappell presents all communication options offered by the .NET Framework 3.5:David Chappell氏は、アーキテクチャの説明の後、.NET Framework 3.5によって提供されるすべての通信オプションを示している。
SOAP と WS-* Web サービス
WCFは、サービス指向アーキテクチャに対してマイクロソフトが提唱しているアプローチでもあるため、SOAP/WS-* Webサービスを開発できるように作成されている。
- WCFでは、SOAP/WS-* メッセージを任意のトランスポート (HTTPやTCPなど) で送信可能。
- 最も重要なWS仕様のサポート。- MSDNでは、.NET Framework 3.5においてシステム標準の相互運用性バインディングがサポートしているWebサービスプロトコルが詳しく説明(source)されている。
- Web Services Interoperability Organization (WS-I) Basic Profile 1.0への準拠をサービスに強制することが可能。
- WCF は、よく使用されるWebサービスシナリオに対応する事前定義バインディングのセットを提供。
WCFアプリケーション間でのバイナリ通信
WCF対WCFの通信について、次のように説明されている。
WCFは、より効率的であるバイナリエンコーディングを使用する通信をサポートします。標準のXMLベースSOAPメッセージをHTTPで送信するのではなく、同じ情報のより効率的な表現をTCPでそのまま送信するという選択肢があります。
REST的Webサービス
WebサービスへのREST的(source)手法が普及しつつあるため、.NET Framework 3.5では、WCFがREST的スタイルをサポートしている。WCFの最初のバージョンは、SOAPベースのサービスに焦点を絞っていたが、「チャネルモデルは非常に汎用的であるため、REST的な通信のサポートは簡単に追加できる」。まず、WCFメッセージはSOAPエンベロープおよびヘッダーを取り除かなければならない。これは、新たに追加されたWebHttpBindingを使用することによって可能になる。
他の] HTTPベースのバインディングと異なり [...]、このバインディングは、WCFの.NET Framework 3.5リリースで新たに登場するエンコーディングオプションWebMessageEncodingを使用します。このオプションは、SOAPヘッダーを追加したり、取り除いたりすることはありません。その代わりに、これは、内容を表現する3種類のオプションを実装しています。テキストベースXMLエンコーディング、JSONエンコーディング、および読むことのできないバイナリエンコーディングです。バイナリエンコーディングは、JPEGファイルの送信などに役立ちます。他のHTTPバインディングと同様、WebHttpBindingも、セキュリティを強化するためにHTTPSを使用するように構成することができます。
操作は、WCF Service ContractにWebGet属性またはWebInvoke属性を付加することによってHTTP動詞 (GET、PUT、POSTまたはDELETEなど) に関連付けることができる。REST的スタイルであるということは、「URIを処理することを必然的に意味する」ので、WCFには、大量の類似するURIを管理する手段としてURIテンプレートが用意されている。これらのテンプレートの目的は、「URIパターンを表現し、そのパターンに合ったURIを処理することが開発者にとって簡単になるようにすること」である。
POXとシンジケーション (RSS、ATOM)
Plain Old XML (POX) メッセージの送信、またはシンジケーションフォーマットの使用は、WCFのREST的モデルがサポートする。
POX、RSS、およびATOMは、いずれもフォーマットです。プロトコルではありません。このため、これらを使用するために専用のWCFバインディングは必要ありません。いずれも通常は、SOAPヘッダーなしでそのままHTTPで送信されます。このため、一般的にはWebHttpBindingが最も適したバインディングとなります。
基幹業務 (LOB) アプリケーションとの通信
WCFは、Webサービスインターフェイスを提供しないアプリケーションと通信するクライアントの開発をサポートする。
これの重要な例としては、SAPなどの基幹業務 (LOB) アプリケーションとの通信が挙げられます。 [...]
このような通信の実現を目的としているのが、WCF 基幹業務 (LOB) アダプタSDKです。「SDK」という名前が示唆しているように、このテクノロジ自体はアダプタを含んでいません。その代わりに、これは、LOBアプリケーション用のアダプタを作成するためのツールおよび実行時環境を提供します。アプリケーション開発者は、作成されたアダプタを使用することによって、基幹業務アプリケーションのサービスを通常のWCFサービスと同じように使用するWCFクライアントを作成することができます。
メッセージキュー経由の通信
メッセージキューと通信することについては、次のように説明されている。
[...] WCFは、MSMQトランスポートチャネルを提供します。キューを使用した通信を行うには、標準のWCFサービスを作成し、他の場合と同様、そのインターフェイスおよびメソッドにServiceContract属性およびOperationContract属性を付けます。このインターフェイスの各操作では、OperationContract属性のIsOneWayプロパティも指定する必要があります。
SOAPエンベロープでラップしている場合も、SOAPエンベロープを使用していない場合も、バイナリメッセージのみがMSMQ経由で送信される。
Windowsピアツーピアネットワーク経由の通信
Windowsピアツーピアネットワークは、主に、コラボレーションのシナリオで使用される。ピアシステムでは、1台のPCがクライアントおよびサーバー (つまり、ピア) として機能する。
他の場合と同様、正しいバインディングを指定することで、WCFアプリケーションはWindowsピアツーピアネットワークを使用できるようになります。NetPeerTcpBinding [...] は、ピア通信に固有のトランスポートチャネルに依存します。このバインディングは、特定のピアシステムに送信されるメッセージの宛先を制御するPnrpPeerResolverチャネルも使用します。
プロセス間通信
WCFは、NetNamedPipeBindingを使用して [同一マシン上のプロセス間での通信] をサポートします[...]。このバインディングは、HTTPやTCPのようなネットワークプロトコルを実装するトランスポートチャネルに依存するのではなく、名前付きパイプを経由して通信するトランスポートチャネルを使用します。名前付きパイプは、プロセス間通信のための標準Windowsメカニズムです。
カスタム通信
WCFでは、通信オプションをさまざまな方法で拡張およびカスタマイズできる。開発者は、カスタムチャネルやカスタムバインディングを作成したり、既存のバインディングをカスタマイズしたりすることが可能だ。David Chappell氏は、カスタム通信のおもしろい説明としてMicrosoft BizTalkサービス(source)を紹介している。
David Chappell氏によれば、「通信のための汎用プラットフォームは、非常に意味がある」。WCFは「1つの共通フレームワーク内で多様な通信形態をサポートする」。しかも、それは簡単に拡張したり、カスタマイズしたりすることが可能だ。