カスタム メッセージ インターセプタ
このサンプルでは、チャネル拡張モデルの使用方法を示します。特に、チャネル ファクトリとチャネル リスナを作成するカスタム バインディング要素を実装して、ランタイム スタックの特定のポイントですべての送受信メッセージを中断する方法を示します。また、このサンプルには、こうしたカスタム ファクトリの使用方法を示すクライアントとサーバーも含まれます。
このサンプルでは、クライアントとサービスは両方ともコンソール プログラム (.exe) です。そして、これらのクライアントとサービスの両方で、カスタム バインディング要素およびこれに関連付けられたランタイム オブジェクトを含む共通ライブラリ (.dll) を使用します。
![]() |
---|
このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。 |
このサンプルでは、Windows Communication Foundation (WCF) でカスタム階層チャネルを作成するための推奨手順について説明します。作成時には、チャネル フレームワークと次に示す WCF のベスト プラクティスを使用します。カスタム階層チャネルを作成する手順は、次のとおりです。
どのチャネル形状をチャネル ファクトリおよびチャネル リスナがサポートするかを決定します。
チャネル形状をサポートするチャネル ファクトリおよびチャネル リスナを作成します。
チャネル スタックにカスタム階層チャネルを追加するバインディング要素を追加します。詳細については、「Adding a Binding Element」を参照してください。
バインディング要素拡張セクションを追加して、新しいバインディング要素を構成システムに公開します。
チャネル形状
カスタム階層チャネルを記述する最初の手順として、どの形状がチャネルに必要かを判断します。メッセージ インスペクタの場合、下のレイヤでサポートされる任意の形状をサポートします (たとえば、下のレイヤで IOutputChannel と IDuplexSessionChannel が作成できる場合は、IOutputChannel と IDuplexSessionChannel を公開します)。
チャネル ファクトリとリスナ ファクトリ
カスタム階層チャネルを記述する次の手順では、クライアント チャネルでの IChannelFactory の実装とサービス チャネルでの IChannelListener の実装を作成します。
これらのクラスでは、内部ファクトリとリスナが取得され、この内部ファクトリとリスナが OnCreateChannel と OnAcceptChannel 以外のすべての呼び出しを代行します。
class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{ ... }
class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{ ... }
バインディング要素の追加
このサンプルでは、InterceptingBindingElement
というカスタム バインディング要素を定義します。InterceptingBindingElement
は ChannelMessageInterceptor
を入力として受け取り、この ChannelMessageInterceptor
を使用して、通過するメッセージを操作します。公開する必要があるクラスはこれだけです。ファクトリ、リスナ、およびチャネルはすべて、ランタイム パブリック インターフェイスの内部実装として設定できます。
public class InterceptingBindingElement : BindingElement
構成サポートの追加
バインディング構成と統合するには、ライブラリで、構成セクション ハンドラをバインディング要素拡張セクションとして定義します。クライアントとサーバーの構成ファイルでは、バインディング要素拡張を構成システムに登録する必要があります。バインディング要素を構成システムに公開する実装は、このクラスから派生できます。
public abstract class InterceptingElement : BindingElementExtensionElement { ... }
ポリシーの追加
ポリシー システムと統合するには、InterceptingBindingElement
に IPolicyExportExtension を実装し、ポリシーの生成に参加する必要があることを通知します。生成されたクライアント上でポリシーのインポートをサポートするには、InterceptingBindingElementImporter
の派生クラスを登録し、CreateMessageInterceptor
() をオーバーライドして、ポリシーが有効なそれらの ChannelMessageInterceptor
クラスを生成します。
例 : 破棄可能なメッセージ インスペクタ
このサンプルには、メッセージを破棄する ChannelMessageInspector
の実装例が含まれています。
class DroppingServerElement : InterceptingElement
{
protected override ChannelMessageInterceptor CreateMessageInterceptor()
{
return new DroppingServerInterceptor();
}
}
この例には、次のように構成からアクセスできます。
<configuration>
...
<system.serviceModel>
...
<extensions>
<bindingElementExtensions>
<add name="droppingInterceptor"
type=
"Microsoft.ServiceModel.Samples.DroppingServerElement, library"/>
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
クライアントとサーバーでは、両方ともこの新しく作成された構成セクションを使用して、カスタム ファクトリをランタイム チャネル スタックの最低レベル (トランスポート レベルの上) に挿入します。
<customBinding>
<binding name="sampleBinding">
<droppingInterceptor/>
<httpTransport/>
</binding>
</customBinding>
クライアントでは MessageInterceptor
ライブラリを使用して、カスタム ヘッダーを偶数番号付きメッセージに追加します。一方、サービスでは MessageInterceptor
ライブラリを使用して、この特殊なヘッダーを持たないメッセージを削除します。
サービスを実行し、次にクライアントを実行すると、次のクライアント出力が表示されます。
Reporting the next 10 wind speed
100 kph
Server dropped a message.
90 kph
80 kph
Server dropped a message.
70 kph
60 kph
Server dropped a message.
50 kph
40 kph
Server dropped a message.
30 kph
20 kph
Server dropped a message.
10 kph
Press ENTER to shut down client
クライアントからは 10 種類の異なる風速がサービスに報告されますが、特殊なヘッダーがあるのはそれらのタグの半分だけです。
サービスには、次の出力が表示されます。
Press ENTER to exit.
Dangerous wind detected! Reported speed (90) is greater than 64 kph.
Dangerous wind detected! Reported speed (70) is greater than 64 kph.
5 wind speed reports have been received.
サンプルを設定、ビルド、および実行するには
「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。
ソリューションをビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
単一コンピュータ構成か複数コンピュータ構成かに応じて、「Windows Communication Foundation サンプルの実行」の手順に従います。
最初に Service.exe を実行して次に Client.exe を実行し、両方のコンソール ウィンドウで出力を表示します。
Copyright © 2007 by Microsoft Corporation.All rights reserved.