扩展WCF的消息分发行为
使用消息分发检查器IDispatchMessageInspector、服务器行为IServiceBehavior、端点行为IEndpointBehavior扩展WCF的消息分发行为
Extend WCF dispatch message behavior with IDispatchMessageInspector IServiceBehavior, IEndpointBehavior
WCF从绑定的通道中接受到客户端调用它的消息后,使用消息分发器将消息发给需要调用的操作。这个过程中我们在不修改原有WCF的程序也不需要加入标签,只需要在WCF的配置文件中加入需要扩展的配置可以实现扩展WCF消息分发。
在我的上一篇博克中,我们可以拦截获取操作参数,在操作调用前和调用后加入自己的扩展,但是这种方法需要在WCF契约的操作中加入标签,这种方法我认为是一种“静态植入”,这种方法需要重新编译。
使用IParameterInspector, IOperationBehavior,Attribute(参数检查器、操作行为接口和标签)扩展WCF操作行为
地址:http://www.cnblogs.com/utopia/archive/2009/12/02/1615280.html
本文讲述使用消息扩展,不需要重新编译,修改配置文件就可以,应该是“动态拦截”的方法。
实现扩展消息分发需要4步:1、实现IDispatchMessageInspector;2、实现Attribute, IServiceBehavior, IEndpointBehavior;3、BehaviorExtensionElement中加入实现的ServiceBehavior和EndPointBehavior;4、在配置文件中加入扩展行为
1、实现IDispatchMessageInspector;
2 {
3 public object AfterReceiveRequest(
4 ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
5 {
6 MessageQueue mq = new MessageQueue(@".\private$\msgqueue");
7 mq.Send("RelSrv get msg from "+"channel.RemoteAddress.ToString()");
8 return null;
9 }
10
11 public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
12 {
13 MessageQueue mq = new MessageQueue(@".\private$\msgqueue");
14 mq.Send("RelSrv sent msg to " + "reply");
15 }
16 }
2、实现Attribute, IServiceBehavior, IEndpointBehavior;
2 {
3 void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription,
4 ServiceHostBase serviceHostBase,
5 System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints,
6 BindingParameterCollection bindingParameters)
7 {
8 }
9 void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription,
10 ServiceHostBase serviceHostBase)
11 {
12 WsdlExporter wsdlExporter = new WsdlExporter();
13 wsdlExporter.ExportEndpoints(serviceDescription.Endpoints,
14 new XmlQualifiedName(serviceDescription.Name, serviceDescription.Namespace));
15
16 foreach (ChannelDispatcher cDispatcher in serviceHostBase.ChannelDispatchers)
17 foreach (EndpointDispatcher endpointDispatcher in cDispatcher.Endpoints)
18 endpointDispatcher.DispatchRuntime.MessageInspectors.Add(
19 new RelMsgInspector( ));
20 }
21 void IServiceBehavior.Validate(ServiceDescription serviceDescription,
22 ServiceHostBase serviceHostBase)
23 {
24 }
25 void IEndpointBehavior.AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
26 {
27 }
28 void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
29 {
30 }
31 void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
32 {
33 WsdlExporter wsdlExporter = new WsdlExporter();
34 wsdlExporter.ExportEndpoint(endpoint);
35 endpointDispatcher.DispatchRuntime.MessageInspectors.Add(
36 new RelMsgInspector());
37 }
38 void IEndpointBehavior.Validate(ServiceEndpoint endpoint)
39 {
40 }
41 }
3、BehaviorExtensionElement中加入实现的ServiceBehavior和EndPointBehavior;
2 {
3 public override Type BehaviorType
4 {
5 get { return typeof(RelMsgValidation); }
6 }
7 protected override object CreateBehavior()
8 {
9 return new RelMsgValidation();
10 }
11 }
4、在配置文件中加入扩展行为
在配置中定义扩展
<behaviorExtensions>
<add name="RelMsgBehavior" type="RelSrvExtends.RelMsgBehaviorExtension, RelSrvExtends, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
在Endpointbehavior 或 Servicebehavior中加入扩展
代码
<endpointBehaviors>
<behavior name="RelSrvMsgBehavior">
<RelMsgBehavior />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
<serviceDebug httpsHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
<RelMsgBehavior />
</behavior>
</serviceBehaviors>
</behaviors>
在Service和Endpoint的配置节中加入上面的behavior
<endpoint address="" behaviorConfiguration="RelSrvMsgBehavior"
binding="basicHttpBinding" name="basicHttpBinding" contract="RelSrvContract.IRelSrvContract" />
当然我们也可以使用VS2008 自带的 WCF 配置文件管理器 SvcConfigEditor.exe 来添加扩展:
配置中定义扩展
在Endpointbehavior 或 Servicebehavior中加入扩展
在Service和Endpoint的配置节中加入上面的behavior
转载于:https://www.cnblogs.com/utopia/archive/2010/01/12/1644741.html
扩展WCF的消息分发行为相关推荐
- 【实战】Unity3d实战之Unity3d网络游戏实战篇(11):消息分发
Unity3d实战之Unity3d网络游戏实战篇(11):消息分发 学习书籍<Unity3d网络游戏实战> 罗培羽著 机械工业出版社 本文是作者在学习过程中遇到的认为值得记录的点,因此引用 ...
- kafka 消息分发机制、分区和副本机制
一.消息分发机制 1.1 kafka 消息分发策略 消息是 kafka 中最基本的数据单元,在 kafka 中,一条消息由key.value两部分构成,在发送一条消息 时,我们可以指定这个key,那么 ...
- 通过WCF Extension定制扩展WCF行为
功能介绍 当我们需要扩展WCF的功能,或者需要实现某些特定的功能,我们必须应用WCF的扩展定制功能(WCF extension),WCF framework提供了丰富的可扩展性,其提供的可扩展接口如下 ...
- 如何通过扩展WCF来定制和扩展WCF行为
当我们需要扩展WCF的功能,或者需要实现某些特定的功能,我们必须应用WCF的扩展定制功能(WCF extension),WCF framework提供了丰富的可扩展性,其提供的可扩展接口如下所示: 1 ...
- 【Android 异步操作】Handler 机制 ( Android 提供的 Handler 源码解析 | Handler 构造与消息分发 | MessageQueue 消息队列相关方法 )
文章目录 一.Handler 构造函数 二.Handler 消息分发 三.MessageQueue 消息队列相关函数 一.Handler 构造函数 一般使用 Handler 时 , 调用 Handle ...
- 深入解析Windows窗口创建和消息分发
Windows GUI采用基于事件驱动的编程模型,事实上几乎所有的界面库都是这样做的.在纯粹的Window32 SDK编程时代,人们还可以搞懂整个Windows窗体创建和消息的流通过程,但是在现在各种 ...
- delphi VCL研究之消息分发机制(转)
原文来源,http://blog.csdn.net/sushengmiyan/article/details/8635550 1.VCL 概貌 先看一下VCL类图的主要分支,如图4.1所示. 在图中可 ...
- 消息分发的同步均衡策略
2019独角兽企业重金招聘Python工程师标准>>> TimeTunnel在做消息分发时有这样一个场景: A类消息需要做实时分析, 且量很大, 故它的消费者不会只是一台机器, 而是 ...
- (转)MTK 消息分发及窗口管理
一.总体结构 1. Software Architecture MediaTek Inc . (MTK) 2. MMI Architecture MTK 平台采用的是Pixtel Communicat ...
最新文章
- 清华大佬教你一招最便捷搭建 Zookeeper 的方法!
- 【转载】数字签名是什么?
- php程序怎么调试,你是怎么调试PHP代码的
- 3-cd 命令总结
- Stanford CS230深度学习(六)目标检测、人脸识别和神经风格迁移
- linux apache压缩包安装目录,源码包安装Apache服务
- 网友发来ifeng网址,打开后却是QQ空间,总提示QQ未登录?原来是一个阴险的诱骗网页...
- c与python内存传递_如何将C中的内存地址转换为python ctypes调用?
- comsol3.5安装教程
- HP OMEN品牌机配3090显卡,驱动,CUDA,Cudnn安装过程
- 【教程】在线生成LaTeX中的表格
- 户外广告的创新思考,媒体运用上的创新
- 支付宝接口http请求及sign加密
- 移动硬盘做pe启动盘
- Facebook 企业广告账户开户流程、资料准备、开户时间、开户须知及OE链接
- stm32怎么加载字库_如何用STM32的片内Flash存储中文字库
- 计算机工程ei是不是不检索了,EI检索的中文期刊_EI检索号查询_如何查询EI检索...
- 【信管9.2】项目沟通管理过程
- Unity3D ——强大的跨平台3D游戏开发工具教程
- 程序员之天梯排行榜,你在哪一级?
热门文章
- Redis 未授权访问缺陷可轻易导致系统被黑
- Bootstrap3 栅格系统-栅格参数
- xmake 新站发布:xmake.io
- 优先队列 HDOJ 5437 Alisha's Party
- 客户端网络pomelo学习笔记 (3) node.js 与 c 客户端 Diffie-Hellman 密钥交换算法的实现客户端网络...
- 云计算再次升温 百度亮剑
- 20佳精美404错误页面设计欣赏
- AIX操作系统启动详细介绍
- yarn界面杀死application
- AttributeError: module 'networkx' has no attribute 'draw_graphviz'解决方案