3

実行中のサービスのすべてのエンドポイントにメッセージインスペクターを自動的に追加するために使用するカスタムServiceHostを作成しました。IDispatchMessageInspectorとIClientMessageInspectorを実装するMessageInspectorを作成し、それをすべてのエンドポイントに追加することになっている次のコードを見つけました。

foreach (ChannelDispatcher channel in this.ChannelDispatchers) {
  foreach (EndpointDispatcher endpoint in channel.Endpoints) {
      endpoint.DispatchRuntime.MessageInspectors.Add(new MyMessageInspector());
   }
}

私が遭遇した問題は、servicehostが開かれるまでChannelDispatchersコレクションが空であるということです。これは、コンストラクターでこのコードを実行できないことを意味します。Openedイベントのイベントハンドラーを作成し、代わりにそのコードを使用しましたが、エンドポイントを追加しようとすると、次のエラーが発生します。

This value cannot be changed after a ServiceHost has been opened

私はある種のキャッチ22に巻き込まれているようですが、私が求めている機能はWCF内で可能ですか?

ありがとう、

マイク

4

1 に答える 1

3

メッセージインスペクターをサービスエンドポイントに追加するには、IServiceBehaviorまたはIEndpointBehaviorのいずれかを実装することによってこれを行う必要があります。最終的に使用したServiceBehaviorの場合、上記のコードをIServiceBehaviorのApplyDispatch()メソッドに配置しました。次に、BehaviorExtensionElementを作成することで構成を介して行うこともできますが、動作をServiceHostに強制的に追加しました。

于 2010-12-29T20:23:09.750 に答える