行为扩展Behavior Extension,使用自定义行为扩展Service Model

1 引言

WCF是一个极具可扩展性的分布是消息通信框架。

对于WCF的一些基本概念不在本文的内容中详细介绍,本文基于你对WCF有一定的认识,并对于其中的基本概念已经有一定的理解。

2 行为扩展

2.1 行为相关的流程

上图是客户端的行为相关的一个流程,也可以看做是一个客户端的调用之后,数据流程。

每个Endpoint对应一个Client Runtime Component,每个Client Runtime Component有多个Client Operation Runtime Component,每个Client Operation Runtime Component又对应一个Endpont’s Contract的方法。

调用一个wcf方法之后,Client Operation Runtime Component负责序列化提交的数据(将来还会反序列化服务端响应的数据),经过Client Runtime Component向上传递,最终传递给WCF Channel Layer。

上图是一个服务端的行为流程。主要参数的组件是Dispatcher组件。它负责接收client的请求消息,传递给适当的服务去处理。

如图,有三种dispatcher。Channel Dispatcher,Endpoint Dispatcher,Operation Dispatcher。它们的职责都在图中有标识。

2.2 扩展步骤

用自定义的行为扩展client runtime component和dispatcher,通常有三个步骤。

2.2.1 声明你要提供的行为属于什么类型

首先要声明这个自定义行为的类型。是工作在客户端,用来向消息中添加序列化之后的提交到服务器的数据?还是工作在服务端,用来管理服务类型的实例?通过实现适当的接口,这一步很容易实现。这些接口大多定义在System.ServiceModel.Dispatcher命名空间中。

假如要自定义一个工作在客户端的行为,功能是自定义数据的序列化过程。实现IClientMessageFormatter接口,实现里面的序列化和反序列化方法就可以了。

假如要自定义一个工作在服务端的行为,功能是管理服务类型的实例。实现IInstanceProvider接口就可以了。

在客户端,和客户端运行时相关的两个类是:

1 System.ServiceModel.Dispatcher.ClientOperation

代表operation操作层面的运行时。

System.ServiceModel.Dispatcher.ClientOperation有两个属性可以附加操作类型的行为。

1)ParameterInspectors,是System.ServiceModel.Dispatcher.IParameterInspector对象的集合。因此,你可以创建自己的参数Inspector行为,可以检查和随意的修改传入传出的数据。

2)Formatter,实现IClientMessageFormatter接口的对象可以赋值给这个属性。用来将传递给服务端的数据序列化到消息中,更精确的说是System.ServiceModel.Channels.Message类型的对象中。

2 System.ServiceModel.Dispatcher.ClientRuntime

代表endpoint层面的运行时。有两个属性可以附加endpoint行为。

1)OperationSelector,实现System.ServiceModel.Dispatcher.IClientOperationSelector 接口的对象可以赋值给这个属性。用来决定一个请求分配到服务的那个方法上。

2)MessageInspectors,实现System.ServiceModel.Dispatcher.IClientMessageInspector接口的对象集合。可以检查,随意修改请求和响应的消息。可以拷贝一份提交的消息,以后可以做审计功能。

在服务端,和dispatcher相关的有三个类。

1 System.ServiceModel.Dispatcher.DispatchOperation

代表operation操作相关的dispatcher类。有三个属性可以附加操作相关的行为。

1)Formatter,实现接口System.ServiceModel.Dispatcher.IDispatchMessageFormatter 的对象。将传入到服务端的消息反序列化为数据,将输出到客户端的响应序列化到消息中。

2)ParameterInspectors,是System.ServiceModel.Dispatcher.IParameterInspector对象的集合。这些对象可以检查,随意修改从dispatcher message formatter传入的反序列化的数据,和传出去的响应数据。

3)Invoker,实现System.ServiceModel.Dispatcher.IOperationInvoker的对象。用来执行服务的实现(服务的接口实现)操作,将由输入消息反序列化产生的数据传递过去。

2 System.ServiceModel.Dispatcher.DispatchRuntime

代表endpoint层面的组件。有下面的几个可以附件行为的属性。

1)InstanceContextProvider,实现System.ServiceModel.Dispatcher.IInstanceContextProvider 接口的对象。用来管理状态信息。

2)OperationSelector,实现System.ServieModel.Dispatcher.IDispatchOperationSelector接口的对象,根据请求消息中的地址,将消息分配到适当的操作。

3)MessageInspectors,实现System.ServiceModel.Dispatcher.IDispatchMessageInspector接口的对象,用来附件一个消息检查器,检查输入的请求消息。

4)InstanceProvider,实现System.ServiceModel.Dispatcher.IInstanceProvider接口的对象,用来管理服务的类型。

3 System.ServiceModel.Dispatcher.ChannelDispatcher

下面是客户端调用一个服务之后,事件的发生顺序。

  1. 客户端的operation selector根据客户端执行的方法决定请求服务端的哪个operation。
  2. 挂在client runtime components上的parameter inspactors检查客户端的调用参数,也可以修改客户端的调用参数。parameter inspactor用来验证传出到服务端的数据是否在合法的范围,如果不在可以修改它。也可以将数据项转变为特定的值。
  3. 客户端的message formatter将数据项序列化为xml,放入到wcf的消息中。
  4. System.ServiceModel.Channel.Message代表传递到endpoint level的client runtime components的消息。
  5. 客户端的message inspactor检查,随意修改System.ServiceModel.Channel.Message对象。
  6. 消息传输到WCF的Channel Layer。更准确的说法是,消息传递到Channel Stack的顶层Channel。
  7. 消息被服务接收,从Channel Layer传递到channel dispatcher,然后传输给适当的endpoint。
  8. instance context provider获取状态信息。
  9. 根据消息中的address,dispatch operation selector决定交给哪个operation。
  10. dispatch message inspactor可以检查,随意修改传入的System.ServiceModel.Channel.Message对象。
  11. instance provider创建或者获取的某一个服务的实例。
  12. 通过dispatch operaiton selector将消息传递给dispatcher component。
  13. dispatch message formatter反序列化消息中的body部分,放入数据项数组中。
  14. dispatcher组件附加的parameter inspactor可以检查,随意修改数据项。
  15. operation invoker执行具体的服务实现,将反序列化的数据项传递给方法的参数。
  16. 如果方法有返回值,附加到dispatcher的parameter inspactor可以检查,修改返回值。
  17. dispatch message formatter序列化返回值,放入System.ServiceModel.Channel.Message对象。
  18. 响应消息传递给endpoint 层的dispatcher组件。
  19. dispatch message inspactor可以检查,随意修改响应消息。
  20. instance context provider可以持久化,或者是抛弃状态信息。
  21. instance provider有机会处理掉它创建的服务的实例instance。
  22. 响应消息传递到channel dispatcher,传递给最高层的channel。
  23. 响应消息被客户端接收,传递给客户端的channel layer。
  24. 客户端的message inspactor检查,修改响应消息。
  25. 客户端的operation selector识别响应消息中的操作。
  26. 响应消息被传递到发出请求的那个操作。
  27. 客户端的message formatter反序列化响应消息的body部分,传递给数据项数组。
  28. 这些数据项数组会别传递给挂在client runtime的parameter inspactor,可以检查和修改数据项。
  29. 程序员的代码使用数据项进行操作。
Technorati 标签: WCF,Extension,Behavior

转载于:https://www.cnblogs.com/virusswb/archive/2010/10/27/1862577.html

WCF扩展:行为扩展Behavior Extension一相关推荐

  1. 聚焦WCF行为的扩展

    WCF以其灵活的可扩展架构为开发者提供了方便,其中对行为的扩展或许是应用中最为常见的.自 定义对行为的扩展并不复杂,但仍有许多细节需要注意.在服务端,一般是对DispatchRuntime和Dispa ...

  2. swift扩展_Swift扩展

    swift扩展 Continuing with our series of Swift tutorials, we'll be discussing and playing around with S ...

  3. ai进入轮廓模式怎么退出_详解AI中扩展、扩展外观、轮廓化描边、创建轮廓

    详解AI中扩展.扩展外观.轮廓化描边.创建轮廓 在学习AI软件中,有不少同学分不清扩展.扩展外观.轮廓化描边.创建轮廓这四个概念具体的功能区别,今天我们具体聊一下. 先说"扩展", ...

  4. 字扩展,位扩展,和字位扩展_6个有用的LibreOffice扩展

    字扩展,位扩展,和字位扩展 LibreOffice是周围最好的免费办公套件,因此,所有主要的Linux发行版都采用了LibreOffice. 尽管LibreOffice已经包含了功能,但是可以使用称为 ...

  5. WCF中使用自定义behavior提示错误的解决方法

    WCF中使用自定义behavior提示错误的解决方法 参考文章: (1)WCF中使用自定义behavior提示错误的解决方法 (2)https://www.cnblogs.com/shenba/arc ...

  6. 横向扩展 纵向扩展 数据库_扩展数据库–减少扩展的艺术

    横向扩展 纵向扩展 数据库 Let's continue the hybrid saga! After two articles talking about the Azure Blob Storag ...

  7. 横向扩展 纵向扩展 数据库_理解数据库扩展模式的指南

    横向扩展 纵向扩展 数据库 There are lot of articles online describing database scalability patterns, but they ar ...

  8. 九、数组的扩展(扩展运算符)

    文章目录 1. 扩展运算符 1.1 含义 1.2 替代函数的 ES5: apply() 方法 1.3 扩展运算符的应用 1.3.1 复制数组 1.3.2 合并数组 1.3.3 与解构赋值结合,会生成 ...

  9. 字扩展,位扩展,和字位扩展_价格合理,可扩展的网站简介

    字扩展,位扩展,和字位扩展 One morning you wake up, grab some coffee, and check the how many people visited your ...

最新文章

  1. 数组与指针的艺术--深入探索c/c++数组与指针的奥秘
  2. boost::hana::replace用法的测试程序
  3. 组件 DataList 和 ObjectDataSource
  4. 这9个人气超高的公众号,你还没关注吗?
  5. vue放大缩小div_vue 放大缩小 svg 图形(原理类似整个列表更新)
  6. SAP License:2021年了!还不知道 SAP顾问的职业前景?
  7. dll放在unity哪个文件夹下_unity调用C#dll文件
  8. 语音识别技术是什么 语音识别技术应用介绍【图文】
  9. Ionic生命周期与注意点
  10. 工厂模式三部曲之工厂方法模式
  11. 【每日一具18】基于HTTP协议的局域网文件共享软件
  12. ESD-PCIe 402-1 CAN卡驱动安装及测试
  13. Vue 自定义项目的创建以及配置
  14. 通过PackageManager 获取未安装的apk的包名,应用名,图标等,有个小吭
  15. 流量卡之家:预约量超百万!华为5G手机线上线下产品紧俏 A股概念股大涨
  16. 最新蚂蚁金服金融源码+蚂蚁财富投资理财源码/基于FastAdminf框架
  17. 基于近似计算的同态加密方案CKKS17----实现库介绍
  18. HYSBZ 1588 营业额统计 伸展树
  19. 建信金科是外包吗_为什么网上黑建信金科的这么多?
  20. php+html+css制作非常好看网站登录与注册界面

热门文章

  1. IE提示“存储空间不足,无法完成此操作”的错误
  2. vue中如何使用mockjs摸拟接口的各种数据
  3. linux配置oracle11G监听及本地网络服务 及 数据库建库
  4. Redhate5.4下Oracle 11g安装
  5. mybatis获取表名_mybatis动态调用表名和字段名
  6. hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地
  7. JavaScript数组方法大全解
  8. 【数字信号处理】线性时不变系统 LTI ( 判断某个系统是否是 “ 非时变 “ 系统 | 案例一 | 先变换后移位 | 先移位后变换 )
  9. 【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )
  10. Touch Bar 废物利用系列 | 在触控栏上显示 Dock 应用图标