カスタム チャネル ディスパッチャー
CustomChannelDispatcher サンプルでは、ServiceHostBase を直接実装することによって、カスタマイズした方法でチャネル スタックを作成する方法と、Web ホスト環境でカスタム チャネル ディスパッチャーを作成する方法を示します。 チャネル ディスパッチャーは、IChannelListener と対話してチャネルを受け入れ、チャネル スタックからメッセージを取得します。 このサンプルには、VirtualPathExtension を使用して Web ホスト環境でチャネル スタックを作成する方法を示す基本的なサンプルも用意されています。
カスタム ServiceHostBase
このサンプルでは、基本型として ServiceHost の代わりに ServiceHostBase を実装して、Windows Communication Foundation (WCF) スタック実装をチャネル スタック上のカスタム メッセージ処理層で置き換える方法を示します。 仮想メソッド InitializeRuntime をオーバーライドして、チャネル リスナーとチャネル ディスパッチャーを作成します。
Web ホスト サービスを実装するには、サービス拡張 VirtualPathExtension を Extensions コレクションから取得し、BindingParameterCollection に追加します。これにより、トランスポート層で、ホスト環境の設定 (つまり、インターネット インフォメーション サービス (IIS) および Windows プロセス アクティブ化サービス (WAS) の設定) に基づいてチャネル リスナーを構成する方法を認識できるようになります。
カスタム チャネル ディスパッチャー
カスタム チャネル ディスパッチャーは型 ChannelDispatcherBase を拡張します。 この型はチャネル層のプログラミング ロジックを実装します。 このサンプルでは、要求/応答メッセージ交換パターンでサポートされるのは IReplyChannel だけですが、カスタム チャネル ディスパッチャーは他の種類のチャネルに簡単に拡張できます。
ディスパッチャーは、まずチャネル リスナーを開き、次にシングルトン応答チャネルを受け入れます。 このチャネルを使用して、無限ループでメッセージ (応答) の送信を開始します。 要求ごとに、応答メッセージを作成し、クライアントに返信します。
応答メッセージの作成
メッセージ処理は型 MyServiceManager
で実装されます。 HandleRequest
メソッドでは、要求がサポートされているかどうか確認するために、メッセージの Action
ヘッダーが最初にチェックされます。 定義済みの SOAP アクション http://tempuri.org/HelloWorld/Hello
は、メッセージのフィルター処理を提供するために定義されています。 これは、ServiceHost の WCF 実装でのサービス コントラクトの概念と似ています。
正しい SOAP アクションの場合、サンプルでは、ServiceHost の場合と同じように、要求されたメッセージ データを取得し、要求に対して対応する応答を生成します。
特に、この場合、正しくコンパイルされていることを確認するためにブラウザーからサービスを参照できるように、カスタム HTML メッセージを返して HTTP-GET 動詞を処理します。 SOAP アクションが一致しない場合は、エラー メッセージを返信して、要求がサポートされていないことを示します。
このサンプルのクライアントは、サービスについて何も想定しない通常の WCF クライアントです。 そのため、このサービスは、通常の WCF ServiceHost 実装から取得した内容と一致するように特別に設計されています。 したがって、クライアントに必要なのはサービス コントラクトだけです。
サンプルの使用
クライアント アプリケーションを直接実行すると、次の出力が生成されます。
Client is talking to a request/reply WCF service.
Type what you want to say to the server: Howdy
Server replied: You said: Howdy. Message id: 1
Server replied: You said: Howdy. Message id: 2
Server replied: You said: Howdy. Message id: 3
Server replied: You said: Howdy. Message id: 4
Server replied: You said: Howdy. Message id: 5
HTTP-GET メッセージがサーバーで処理されるように、ブラウザーからサービスを参照することもできます。 この場合、適切に書式設定された HTML テキストが返信されます。