Windows Communication Foundation (WCF) チャネル スタックは、メッセージを処理する 1 つ以上のチャネルを含む階層化された通信スタックです。 スタックの下部には、チャネル スタックを基になるトランスポート (TCP、HTTP、SMTP、その他の種類のトランスポートなど) に適応させるトランスポート チャネルがあります。 チャネルは、メッセージを送受信するための低レベルのプログラミング モデルを提供します。 このプログラミング モデルは、WCF チャネル モデルと総称される複数のインターフェイスとその他の型に依存しています。 このトピックでは、チャネル図形、基本的なチャネル リスナー (サービス上) の構築、およびチャネル ファクトリ (クライアント上) について説明します。
チャネル スタック
WCF エンドポイントは、チャネル スタックと呼ばれる通信スタックを使用して世界と通信します。 次の図は、チャネル スタックと他の通信スタック (TCP/IP など) を比較しています。
まず、類似点: どちらの場合も、スタックの各レイヤーは、そのレイヤーの下にある世界の抽象化を提供し、その抽象化をその真上のレイヤーにのみ公開します。 各レイヤーは、その真下にあるレイヤーのみの抽象化を使用します。 また、どちらの場合も、2 つのスタックが通信する場合、各レイヤーは他のスタック内の対応するレイヤーと通信します。たとえば、IP 層は IP 層と通信し、TCP レイヤーは TCP レイヤーと通信します。
ここでの違い: TCP スタックは物理ネットワークの抽象化を提供するように設計されていますが、チャネル スタックは、メッセージの配信方法、つまりトランスポートだけでなく、メッセージ内の内容や通信に使用されるプロトコルなどの他の機能の抽象化を提供するように設計されています。 トランスポートを含むが、それよりもはるかに多く。 たとえば、信頼できるセッション バインド要素はチャネル スタックの一部ですが、トランスポートまたはトランスポート自体の下にありません。 この抽象化は、基になるトランスポート プロトコルをチャネル スタック アーキテクチャに適応させるためにスタック内の下位チャネルを要求し、さらにスタック内のチャネルに依存して信頼性の保証やセキュリティなどの通信機能を提供することで実現されます。
メッセージは、 Message オブジェクトとして通信スタックを通過します。 上の図に示すように、下部チャネルはトランスポート チャネルと呼ばれます。 これは、他のパーティとの間でメッセージを送受信する役割を担うチャネルです。 これには、他の当事者との通信に使用される形式との間で Message オブジェクトを変換する責任が含まれます。 トランスポート チャネルの上には、信頼性の高い配信保証などの通信機能を提供する役割を担う任意の数のプロトコル チャネルがあります。 プロトコル チャネルは、Message オブジェクトとして流れるメッセージに対して動作します。 通常、ヘッダーの追加や本文の暗号化などによってメッセージを変換するか、受信確認などの独自のプロトコル制御メッセージを送受信します。
チャネル図形
各チャネルは、チャネル図形インターフェイスまたはチャネル図形と呼ばれる 1 つ以上のインターフェイスを実装します。 これらのチャネル図形は、チャネルが実装する送受信や要求、応答、チャネル呼び出しのユーザーなどの通信指向のメソッドを提供します。 チャネル図形の基になるのは、 IChannel インターフェイスです。これは、スタック内のチャネルによって公開される任意の機能にアクセスするための階層化されたメカニズムとして意図された GetProperty
<T> メソッドを提供するインターフェイスです。
IChannelを拡張する 5 つのチャネル図形は次のとおりです。
さらに、これらの各図形には、セッションをサポートするために System.ServiceModel.Channels.ISessionChannel<TSession> を拡張する同等の図形があります。 これらは:
チャネル図形は、既存のトランスポート プロトコルでサポートされている基本的なメッセージ交換パターンの一部の後にパターン化されます。 たとえば、一方向メッセージングは IInputChannel/IOutputChannel ペアに対応し、要求/応答は IRequestChannel/IReplyChannel ペアに対応し、双方向双方向通信は IDuplexChannel に対応します ( IInputChannel と IOutputChannelの両方を拡張します)。
チャネル スタックを使用したプログラミング
チャネル スタックは通常、バインディングによってチャネル スタックが作成されるファクトリ パターンを使用して作成されます。 送信側では、バインドを使用して ChannelFactoryを構築し、チャネル スタックを構築し、スタック内の最上位チャネルへの参照を返します。 その後、アプリケーションはこのチャネルを使用してメッセージを送信できます。 詳細については、「 クライアント Channel-Level プログラミング」を参照してください。
受信側では、バインディングを使用して、受信メッセージをリッスンする IChannelListenerを構築します。 IChannelListenerは、チャネル スタックを作成し、アプリケーション参照をトップ チャネルに渡すことによって、リッスンしているアプリケーションにメッセージを提供します。 その後、アプリケーションはこのチャネルを使用して受信メッセージを受信します。 詳細については、「 サービス Channel-Level プログラミング」を参照してください。
チャネル オブジェクト モデル
チャネル オブジェクト モデルは、チャネル、チャネル リスナー、チャネル ファクトリを実装するために必要なインターフェイスのコア セットです。 カスタム実装を支援するために提供される基底クラスもあります。
チャネル リスナーは、受信メッセージをリッスンし、チャネル リスナーによって作成されたチャネルを介して上記のレイヤーに配信する役割を担います。
チャネル ファクトリは、メッセージの送信と、チャネル ファクトリが閉じられたときに作成したすべてのチャネルを閉じるために使用されるチャネルを作成する役割を担います。
ICommunicationObject は、すべての通信オブジェクトが実装する基本的なステート マシンを定義するコア インターフェイスです。 CommunicationObject は、インターフェイスを再実装するのではなく、他のチャネル クラスから派生できるこのコア インターフェイスの実装を提供します。 ただし、これは必須ではありません。カスタム チャネルは ICommunicationObject を直接実装でき、 CommunicationObjectから継承することはできません。 図 3 のクラスはいずれもチャネル モデルの一部と見なされていません。これらは、チャネルを構築するカスタム チャネル実装者が使用できるヘルパーです。
次のトピックでは、チャネル オブジェクト モデルと、カスタム チャネルの構築に役立つさまざまな開発領域について説明します。
トピック | 説明 |
---|---|
サービス: チャンネルリスナーとチャンネル | サービス アプリケーションで受信チャネルをリッスンするチャネル リスナーについて説明します。 |
クライアント: チャネルファクトリーおよびチャネル | サービス アプリケーションに接続するチャネルを作成するチャネル ファクトリについて説明します。 |
状態の変更について | チャネルでの System.ServiceModel.ICommunicationObject インターフェイス モデルの状態の変化について説明します。 |
メッセージ交換パターンの選択 | チャネルでサポートできる 6 つの基本的なメッセージ交換パターンについて説明します。 |
例外とエラーの処理 | カスタム チャネルでエラーと例外を処理する方法について説明します。 |
構成とメタデータのサポート | アプリケーション モデルからのカスタム チャネルの使用をサポートする方法と、バインドとバインド要素を使用してメタデータをエクスポートおよびインポートする方法について説明します。 |