CustomChannelDispatcher サンプルでは、ServiceHostBaseを直接実装してカスタムの方法でチャネル スタックを構築する方法と、Web ホスト環境でカスタム チャネル ディスパッチャーを作成する方法を示します。 チャネル ディスパッチャーは IChannelListener と対話してチャネルを受け入れ、チャネル スタックからメッセージを取得します。 このサンプルでは、 VirtualPathExtensionを使用して Web ホスト環境でチャネル スタックを構築する方法を示す基本的なサンプルも提供します。
Custom ServiceHostBase
このサンプルでは、ServiceHostではなく、基本型のServiceHostBaseを実装して、Windows Communication Foundation (WCF) スタックの実装をチャネル スタック上のカスタム メッセージ処理レイヤーに置き換える方法を示します。 仮想メソッド InitializeRuntime をオーバーライドして、チャネル リスナーとチャネル ディスパッチャーを構築します。
Web ホスト型サービスを実装するには、Extensions コレクションからサービス拡張機能VirtualPathExtensionを取得し、それをBindingParameterCollectionに追加して、トランスポート層がホスティング環境設定 (インターネット インフォメーション サービス (IIS)/Windows プロセス アクティブ化サービス (WAS) 設定) に基づいてチャネル リスナーを構成する方法を認識できるようにします。
カスタム チャネル ディスパッチャー
カスタム チャネル ディスパッチャーは、型 ChannelDispatcherBaseを拡張します。 この型は、チャネル層プログラミング ロジックを実装します。 このサンプルでは、要求/応答メッセージ交換パターンでは IReplyChannel のみがサポートされていますが、カスタム チャネル ディスパッチャーを他のチャネルの種類に簡単に拡張できます。
ディスパッチャーは最初にチャネル リスナーを開き、シングルトン応答チャネルを受け入れます。 チャネルでは、無限ループでメッセージ (要求) の送信が開始されます。 要求ごとに、応答メッセージが作成され、クライアントに送信されます。
応答メッセージの作成
メッセージ処理は、 MyServiceManager
型で実装されます。
HandleRequest
メソッドでは、メッセージの Action
ヘッダーが最初にチェックされ、要求がサポートされているかどうかを確認します。 定義済みの SOAP アクション http://tempuri.org/HelloWorld/Hello
は、メッセージ のフィルター処理を提供するために定義されています。 これは、の WCF 実装におけるサービス コントラクトの概念に似ています。
正しい SOAP アクション ケースの場合、サンプルは要求されたメッセージ データを取得し、 ServiceHost の場合と同様の要求に対応する応答を生成します。
カスタム HTML メッセージを返すことによって、HTTP-GET 動詞を特別に処理しました。この場合、ブラウザーからサービスを参照して、正しくコンパイルされていることを確認できます。 SOAP アクションが一致しない場合は、エラー メッセージを送信して要求がサポートされていないことを示します。
このサンプルのクライアントは、サービスから何も想定しない通常の WCF クライアントです。 そのため、サービスは、通常の WCFServiceHost 実装から得られる内容と一致するように特別に設計されています。 その結果、クライアントではサービス コントラクトのみが必要になります。
サンプルの使用
クライアント アプリケーションを直接実行すると、次の出力が生成されます。
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 テキストが返されます。