次の方法で共有


クライアント : チャネル ファクトリとチャネル

このトピックでは、チャネル ファクトリとチャネルの作成について説明します。

チャネル ファクトリとチャネル

チャネル ファクトリは、チャネルの作成を担当します。 チャネル ファクトリによって作成されたチャネルは、メッセージの送信に使用されます。 これらのチャネルは、上記のレイヤーからメッセージを取得し、必要な処理を実行し、次のレイヤーにメッセージを送信する役割を担います。 次の図は、このプロセスを示しています。

クライアント ファクトリとチャネル
チャネル ファクトリによってチャネルが作成されます。

終了時に、チャネル ファクトリは、作成したチャネルのうちまだ閉じていないチャネルを閉じる必要があります。 チャネル リスナーが閉じられると、新しいチャネルの受け入れのみが停止し、既存のチャネルが開いたままになるため、メッセージの受信を続行できるため、モデルは非対称であることに注意してください。

WCF には、このプロセスの基本クラス ヘルパーが用意されています。 (このトピックで説明するチャネル ヘルパー クラスの図については、「 チャネル モデルの概要」を参照してください)。

次の説明は、 トランスポート: UDP サンプルに基づいています。

チャネル ファクトリの作成

UdpChannelFactoryChannelFactoryBaseから派生します。 このサンプルでは、メッセージ エンコーダーのメッセージ バージョンへのアクセスを提供するために、 GetProperty をオーバーライドします。 さらに、OnClose をオーバーライドして、ステート マシンの移行時に BufferManager のインスタンスを破棄します。

UDP 出力チャネル

UdpOutputChannelIOutputChannelを実装します。 コンストラクターは、引数を検証し、渡された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  
);  

こちらも参照ください