我创建了一个自定义ServiceHost,我想用它来自动将消息检查器添加到其上运行的服务的每个端点。我创建了一个实现IDispatchMessageInspector和IClientMessageInspector的MessageInspector,并找到了应该将它添加到每个端点的以下代码:
foreach (ChannelDispatcher channel in this.ChannelDispatchers) {
foreach (EndpointDispatcher endpoint in channel.Endpoints) {
endpoint.DispatchRuntime.MessageInspectors.Add(new MyMessageInspector());
}
}
我遇到的问题是ChannelDispatchers集合在打开servicehost之前是空的,这意味着我无法在构造函数中运行此代码。我为Opened事件创建了一个事件处理程序,并在那里使用了该代码,但是在尝试添加端点时出现以下错误:
This value cannot be changed after a ServiceHost has been opened
似乎我遇到某种Catch 22,我在WCF中寻求的功能是什么?
谢谢,
麦克
答案 0 :(得分:3)
为了将消息检查器添加到服务端点,必须通过实现IServiceBehavior或IEndpointBehavior来完成。对于我最终使用的ServiceBehavior,我将上面的代码放在IServiceBehavior的ApplyDispatch()方法中。然后我强制性地将行为添加到我的ServiceHost中,尽管我可以通过创建BehaviorExtensionElement来完成配置。