このトピックでは、チャネル ファクトリとチャネルの作成について説明します。
チャネル ファクトリとチャネル
チャネル ファクトリは、チャネルの作成を担当します。 チャネル ファクトリによって作成されたチャネルは、メッセージの送信に使用されます。 これらのチャネルは、上記のレイヤーからメッセージを取得し、必要な処理を実行し、次のレイヤーにメッセージを送信する役割を担います。 次の図は、このプロセスを示しています。
チャネル ファクトリによってチャネルが作成されます。
終了時に、チャネル ファクトリは、作成したチャネルのうちまだ閉じていないチャネルを閉じる必要があります。 チャネル リスナーが閉じられると、新しいチャネルの受け入れのみが停止し、既存のチャネルが開いたままになるため、メッセージの受信を続行できるため、モデルは非対称であることに注意してください。
WCF には、このプロセスの基本クラス ヘルパーが用意されています。 (このトピックで説明するチャネル ヘルパー クラスの図については、「 チャネル モデルの概要」を参照してください)。
CommunicationObject クラスは、ICommunicationObjectを実装し、「チャネルの開発」の手順 2 で説明されているステート マシンを適用します。
ChannelManagerBase クラスはCommunicationObjectを実装し、System.ServiceModel.Channels.ChannelFactoryBaseとSystem.ServiceModel.Channels.ChannelListenerBaseの統合基本クラスを提供します。 ChannelManagerBase クラスは、ChannelBaseを実装する基底クラスである IChannel と組み合わせて動作します。
ChannelFactoryBase クラスは、ChannelManagerBaseとIChannelFactoryを実装し、
CreateChannel
オーバーロードを 1 つのOnCreateChannel
抽象メソッドに統合します。ChannelListenerBase クラスは、IChannelListenerを実装します。 基本状態管理を行います。
次の説明は、 トランスポート: UDP サンプルに基づいています。
チャネル ファクトリの作成
UdpChannelFactory
は ChannelFactoryBaseから派生します。 このサンプルでは、メッセージ エンコーダーのメッセージ バージョンへのアクセスを提供するために、 GetProperty をオーバーライドします。 さらに、OnClose をオーバーライドして、ステート マシンの移行時に BufferManager のインスタンスを破棄します。
UDP 出力チャネル
UdpOutputChannel
はIOutputChannelを実装します。 コンストラクターは、引数を検証し、渡されたEndPointに基づいてEndpointAddressオブジェクトを作成します。
OnOpenのオーバーライドにより、このEndPointにメッセージを送信するために使用されるソケットが作成されます。
this.socket = new Socket(
this.remoteEndPoint.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp
);
チャネルが閉じる際には、正常終了することも異常終了することもあります。 チャネルが正常に閉じている場合、ソケットは閉じられ、基底クラス OnClose
メソッドへの呼び出しが行われます。 これが例外をスローした場合、インフラストラクチャはチャネルをクリーンにするために Abort
を呼び出します。
this.socket.Close();
base.OnClose(timeout);
Send()
とBeginSend()
/EndSend()
を実装します。 これは、2 つの主要なセクションに分かれています。 最初に、メッセージをバイト配列にシリアル化します。
ArraySegment<byte> messageBuffer = EncodeMessage(message);
次に、結果のデータをネットワーク上に送信します。
this.socket.SendTo(
messageBuffer.Array,
messageBuffer.Offset,
messageBuffer.Count,
SocketFlags.None,
this.remoteEndPoint
);