使用消息分发检查器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、实现IDispatchMessageInspector2、实现Attribute, IServiceBehavior, IEndpointBehavior3BehaviorExtensionElement中加入实现的ServiceBehaviorEndPointBehavior4、在配置文件中加入扩展行为

1、实现IDispatchMessageInspector

 

代码

 1    public class RelMsgInspector :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

 

代码

 1  public class RelMsgValidation : 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     }

3BehaviorExtensionElement中加入实现的ServiceBehaviorEndPointBehavior

 

代码

 1     public class RelMsgBehaviorExtension : BehaviorExtensionElement
 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、在配置文件中加入扩展行为

在配置中定义扩展

代码

    <extensions>
      <behaviorExtensions>
        <add name="RelMsgBehavior" type="RelSrvExtends.RelMsgBehaviorExtension, RelSrvExtends, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      </behaviorExtensions>
    </extensions>

在Endpointbehavior 或 Servicebehavior中加入扩展

代码

    <behaviors>
      <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

代码

<service behaviorConfiguration="DefaultBehavior" name="RelSrv.RelSrv">
        <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的消息分发行为相关推荐

  1. 【实战】Unity3d实战之Unity3d网络游戏实战篇(11):消息分发

    Unity3d实战之Unity3d网络游戏实战篇(11):消息分发 学习书籍<Unity3d网络游戏实战> 罗培羽著 机械工业出版社 本文是作者在学习过程中遇到的认为值得记录的点,因此引用 ...

  2. kafka 消息分发机制、分区和副本机制

    一.消息分发机制 1.1 kafka 消息分发策略 消息是 kafka 中最基本的数据单元,在 kafka 中,一条消息由key.value两部分构成,在发送一条消息 时,我们可以指定这个key,那么 ...

  3. 通过WCF Extension定制扩展WCF行为

    功能介绍 当我们需要扩展WCF的功能,或者需要实现某些特定的功能,我们必须应用WCF的扩展定制功能(WCF extension),WCF framework提供了丰富的可扩展性,其提供的可扩展接口如下 ...

  4. 如何通过扩展WCF来定制和扩展WCF行为

    当我们需要扩展WCF的功能,或者需要实现某些特定的功能,我们必须应用WCF的扩展定制功能(WCF extension),WCF framework提供了丰富的可扩展性,其提供的可扩展接口如下所示: 1 ...

  5. 【Android 异步操作】Handler 机制 ( Android 提供的 Handler 源码解析 | Handler 构造与消息分发 | MessageQueue 消息队列相关方法 )

    文章目录 一.Handler 构造函数 二.Handler 消息分发 三.MessageQueue 消息队列相关函数 一.Handler 构造函数 一般使用 Handler 时 , 调用 Handle ...

  6. 深入解析Windows窗口创建和消息分发

    Windows GUI采用基于事件驱动的编程模型,事实上几乎所有的界面库都是这样做的.在纯粹的Window32 SDK编程时代,人们还可以搞懂整个Windows窗体创建和消息的流通过程,但是在现在各种 ...

  7. delphi VCL研究之消息分发机制(转)

    原文来源,http://blog.csdn.net/sushengmiyan/article/details/8635550 1.VCL 概貌 先看一下VCL类图的主要分支,如图4.1所示. 在图中可 ...

  8. 消息分发的同步均衡策略

    2019独角兽企业重金招聘Python工程师标准>>> TimeTunnel在做消息分发时有这样一个场景: A类消息需要做实时分析, 且量很大, 故它的消费者不会只是一台机器, 而是 ...

  9. (转)MTK 消息分发及窗口管理

    一.总体结构 1. Software Architecture MediaTek Inc . (MTK) 2. MMI Architecture MTK 平台采用的是Pixtel Communicat ...

最新文章

  1. 清华大佬教你一招最便捷搭建 Zookeeper 的方法!
  2. 【转载】数字签名是什么?
  3. php程序怎么调试,你是怎么调试PHP代码的
  4. 3-cd 命令总结
  5. Stanford CS230深度学习(六)目标检测、人脸识别和神经风格迁移
  6. linux apache压缩包安装目录,源码包安装Apache服务
  7. 网友发来ifeng网址,打开后却是QQ空间,总提示QQ未登录?原来是一个阴险的诱骗网页...
  8. c与python内存传递_如何将C中的内存地址转换为python ctypes调用?
  9. comsol3.5安装教程
  10. HP OMEN品牌机配3090显卡,驱动,CUDA,Cudnn安装过程
  11. 【教程】在线生成LaTeX中的表格
  12. 户外广告的创新思考,媒体运用上的创新
  13. 支付宝接口http请求及sign加密
  14. 移动硬盘做pe启动盘
  15. Facebook 企业广告账户开户流程、资料准备、开户时间、开户须知及OE链接
  16. stm32怎么加载字库_如何用STM32的片内Flash存储中文字库
  17. 计算机工程ei是不是不检索了,EI检索的中文期刊_EI检索号查询_如何查询EI检索...
  18. 【信管9.2】项目沟通管理过程
  19. Unity3D ——强大的跨平台3D游戏开发工具教程
  20. 程序员之天梯排行榜,你在哪一级?

热门文章

  1. Redis 未授权访问缺陷可轻易导致系统被黑
  2. Bootstrap3 栅格系统-栅格参数
  3. xmake 新站发布:xmake.io
  4. 优先队列 HDOJ 5437 Alisha's Party
  5. 客户端网络pomelo学习笔记 (3) node.js 与 c 客户端 Diffie-Hellman 密钥交换算法的实现客户端网络...
  6. 云计算再次升温 百度亮剑
  7. 20佳精美404错误页面设计欣赏
  8. AIX操作系统启动详细介绍
  9. yarn界面杀死application
  10. AttributeError: module 'networkx' has no attribute 'draw_graphviz'解决方案