MessageInterceptor サンプルでは、チャネル拡張モデルの使用方法を示します。 具体的には、チャネル ファクトリとチャネル リスナーを作成するカスタム バインド要素を実装して、実行時スタック内の特定のポイントですべての受信メッセージと送信メッセージをインターセプトする方法を示します。 このサンプルには、これらのカスタム ファクトリの使用方法を示すクライアントとサーバーも含まれています。
このサンプルでは、クライアントとサービスの両方がコンソール プログラム (.exe) です。 クライアントとサービスの両方で、カスタム バインド要素とそれに関連付けられているランタイム オブジェクトを含む共通ライブラリ (.dll) を使用します。
注
このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。
このサンプルでは、チャネル フレームワークを使用し、WCF のベスト プラクティスに従って、Windows Communication Foundation (WCF) でカスタムレイヤーチャネルを作成するための推奨手順について説明します。 カスタムレイヤーチャネルを作成する手順は次のとおりです。
チャネル ファクトリとチャネル リスナーがサポートするチャネルシェイプを決定します。
チャネル ファクトリと、チャネル図形をサポートするチャネル リスナーを作成します。
カスタム階層チャネルをチャネル スタックに追加するバインド要素を追加します。
新しいバインド要素を構成システムに公開するバインド要素拡張セクションを追加します。
チャネル図形
カスタム階層チャネルを作成する最初の手順は、チャネルに必要な図形を決定することです。 メッセージ インスペクターでは、下のレイヤーがサポートする任意の図形をサポートします (たとえば、下のレイヤーで 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.
サンプルを設定、ビルド、実行するには
次のコマンド ASP.NET 使用して 4.0 をインストールします。
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
Windows Communication Foundation サンプル のOne-Time セットアップ手順を実行していることを確認します。
ソリューションをビルドするには、「 Windows Communication Foundation サンプルのビルド」の手順に従います。
単一または複数のコンピューター間の構成でサンプルを実行するには、「Windows Communication Foundation Samplesの実行」の手順に従います。
最初 Service.exe 実行してから Client.exe を実行し、両方のコンソール ウィンドウで出力を確認します。