WCF扩展:行为扩展Behavior Extension<一>

简介:

行为扩展Behavior Extension,使用自定义行为扩展Service Model
 
1 引言
 
WCF是一个极具可扩展性的分布是消息通信框架。
对于WCF的一些基本概念不在本文的内容中详细介绍,本文基于你对WCF有一定的认识,并对于其中的基本概念已经有一定的理解。
2 行为扩展
 
2.1 行为相关的流程
WCF
 
上图是客户端的行为相关的一个流程,也可以看做是一个客户端的调用之后,数据流程。
每个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。
 
WCF
 
上图是一个服务端的行为流程。主要参数的组件是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. 程序员的代码使用数据项进行操作。



  30. 本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/411340,如需转载请自行联系原作者
目录
相关文章
|
前端开发 .NET 开发框架
Wcf扩展
ASP.NET MVC和WCF真是微软两个很棒的框架,设计的很好,可扩展性非常强,到处都是横切、管道。 以前写过一篇MVC流程的文章,http://www.cnblogs.com/lovecindywang/archive/2010/12/02/1894740.html主要是使用了MVC的各种扩展。
800 0
|
.NET 网络架构
告别复杂WCF扩展 REST过程 ,让他 so easy
在看一些wcf的书和文章时,都会提到rest wcf ,实现方式多数通过对wcf进行一定程度的扩展实现的,实在是让我这种菜鸟心生畏惧~ 前些天为了体验mvc3安装了vs2010,顺便在在线模板里面搜索了一下wcf,没想到有意外发现,有图为证,这年代无图无真相   选择wcf后...
769 0
跟着Artech学习WCF扩展(2) 自定义Channel与执行的顺序
源代码下载地址:点我 原文地址:http://www.cnblogs.com/artech/archive/2008/07/09/1238626.html 这节不看源码 看着真费劲哈   服务器端是这样的顺序 MyBindingElement.
732 0
跟着Artech学习WCF扩展(3) 扩展CallContextInitializer
代码下载:点我   作为备份 Artech的代码要在他的博客里面找的 Artech大师级的“总分总”式的风格,的确是和高手过招用,作为一面菜鸟,纠结了老半天才明白,原来写博客也可以前后呼应 于是把这个小节点整理到一起已被以后不时只需     5 、自定义CallContextInitializer (Step 12 & Step 18) 提到CallContextInitializer,我想有一部分人会马上想到System.Runtime.Remoting.Messaging.CallContext。
763 0
|
信息无障碍
跟着Artech学习WCF扩展(4) 扩展MessageInspector
自定义MessageInspector 在client端和service端都有自己的MessageInspector,client端叫做ClientMessageInspector,实现System.ServiceModel.Dispatcher.IClientMessageInspector interface,而service端叫做 DispatchMessageInspector, 实现了System.ServiceModel.Dispatcher.IDispatchMessageInspector interface。
872 0
跟着Artech学习WCF扩展(1) Binding进行通信
这个demo简单 就一个服务器段的一个客户端的 主要是注释 Server的 using System; using System.Collections.Generic; using System.
713 0
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
73 0
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
107 0