添加到Endpoint Behaviors后IEndpointBehavior的ApplyClientBehavior方法未执行
嘿,我来帮你排查下这个WCF行为的问题——你说实现了IEndpointBehavior的InspectorBehavior加到端点行为后,ApplyClientBehavior没执行,对吧?这在WCF开发里挺常见的,我整理了几个大概率的原因和对应的解决办法,你可以挨个试:
1. 先确认行为添加的时机和对象对不对
- 如果是用配置文件加行为:一定要保证行为配置和端点的
behaviorConfiguration对应上。比如你在<endpointBehaviors>里定义的行为名称,必须和<client>节点里端点的behaviorConfiguration属性完全一致,举个配置示例:
<system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="MyInspectorBehavior"> <inspectorBehavior /> <!-- 这里是你自定义的行为扩展节点 --> </behavior> </endpointBehaviors> </behaviors> <client> <endpoint address="http://your-service-url" binding="basicHttpBinding" contract="IMyService" behaviorConfiguration="MyInspectorBehavior" /> </client> </system.serviceModel>
- 如果是通过代码加行为:记住要在创建
ChannelFactory或者ClientBase实例之前把行为加到端点上,别等客户端通道已经创建好了再加,那样就晚了。比如正确的代码顺序应该是这样:
// 先创建工厂 var factory = new ChannelFactory<IMyService>(new BasicHttpBinding(), new EndpointAddress("http://your-service-url")); // 给端点添加你的自定义行为,别忘了给MessageInspector赋值 factory.Endpoint.Behaviors.Add(new InspectorBehavior { MessageInspector = new MyClientMessageInspector() }); // 最后再创建客户端通道 var client = factory.CreateChannel();
2. 用配置的话,必须注册行为扩展
如果是靠配置文件加载自定义行为,你得先在<extensions>节里注册你的行为类型,不然WCF根本不知道怎么实例化你的InspectorBehavior。示例代码如下:
<system.serviceModel> <extensions> <behaviorExtensions> <add name="inspectorBehavior" type="YourNamespace.InspectorBehaviorElement, YourAssemblyName" /> </behaviorExtensions> </extensions> <!-- 其他配置内容... --> </system.serviceModel>
这里的InspectorBehaviorElement是你需要自己实现的BehaviorExtensionElement子类,用来解析配置并返回InspectorBehavior的实例。
3. 别搞混客户端和服务端的行为
ApplyClientBehavior这个方法只有在客户端端点上才会触发!如果你不小心把行为加到了服务端的端点行为里,那只会触发ApplyDispatchBehavior,而客户端的方法根本不会跑。所以一定要确认你是在客户端的配置/代码里添加的行为,不是服务端的。
4. 检查MessageInspector的关联逻辑
从你贴的代码片段看,InspectorBehavior里有个MessageInspector属性,我猜你在ApplyClientBehavior里应该是要把它加到clientRuntime.MessageInspectors集合里对吧?比如完整的方法应该是这样:
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { if (MessageInspector != null) { clientRuntime.MessageInspectors.Add(MessageInspector); } }
不过这一步是方法执行后的逻辑,你现在是方法没执行,所以先解决前面的问题,但如果方法执行了没效果,也要确认这个属性有没有被正确赋值。
5. 排查是否有其他行为干扰
有时候如果有其他自定义行为或者WCF内置行为修改了ClientRuntime,可能会导致你的行为没被正确执行。你可以暂时移除其他所有自定义行为,只保留你的InspectorBehavior,看看能不能触发方法——如果可以,再逐个加回其他行为排查冲突。
内容的提问来源于stack exchange,提问作者Dean

