`

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

    博客分类:
  • WCF
阅读更多

 

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

 

1 引言

 

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

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

2 行为扩展

 

2.1 行为相关的流程

WCF Client Behavior

 

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

每个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 Server Behavior

 

上图是一个服务端的行为流程。主要参数的组件是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
分享到:
评论

相关推荐

    MSDN杂志 2008年第二期

    本期MSDN杂志的主要内容有:&lt;br&gt;&lt;br&gt;• 自己动手: 创建 .NET Framework 语言编译器&lt;br&gt;&lt;br&gt;• WinUnit: 简化的本机 C++ 应用程序单元测试&lt;br&gt;&lt;br&gt;• Silverlight: 创建自定义 Expression Encoder 发布插件&lt;br&gt;&lt;br&gt;•...

    WCF 消息压缩 自定义验证(X509证书指纹验证)

    &lt;behavior&gt; &lt;serviceCredentials&gt; &lt;clientCertificate&gt; &lt;authentication certificateValidationMode="Custom" customCertificateValidatorType="YourNamespace.CustomCertificateValidator, YourAssembly" /&gt; ...

    WCF JS 调用案例 Jquery调用案例

    &lt;behavior name="webBehavior"&gt; &lt;webHttp/&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;/behaviors&gt; &lt;/system.serviceModel&gt; ``` 现在,服务已经准备就绪,可以使用jQuery进行调用了。在HTML页面中,首先引入jQuery库...

    wcf get、post配置

    &lt;behavior name="Internet"&gt; &lt;serviceMetadata httpGetEnabled="false" /&gt; &lt;/behavior&gt; &lt;behavior&gt; &lt;serviceMetadata httpGetEnabled="True"/&gt; &lt;serviceDebug includeExceptionDetailInFaults="true" /&gt; &lt;/...

    WCF 返回json 格式

    &lt;behavior&gt; &lt;serviceMetadata httpGetEnabled="true" /&gt; &lt;serviceDebug includeExceptionDetailInFaults="false" /&gt; &lt;/behavior&gt; &lt;/serviceBehaviors&gt; &lt;endpointBehaviors&gt; &lt;behavior&gt; &lt;web...

    WCF服务宿主及其跨域问题解决实例

    &lt;behavior&gt; &lt;serviceMetadata httpGetEnabled="true" /&gt; &lt;serviceDebug includeExceptionDetailInFaults="false" /&gt; &lt;/behavior&gt; &lt;/serviceBehaviors&gt; &lt;/behaviors&gt; &lt;bindings&gt; &lt;webHttpBinding&gt; &lt;binding ...

    WCF与AJAX交互DEMO

    &lt;behavior&gt; &lt;serviceMetadata httpGetEnabled="true" /&gt; &lt;serviceDebug includeExceptionDetailInFaults="false" /&gt; &lt;/behavior&gt; &lt;/serviceBehaviors&gt; &lt;endpointBehaviors&gt; &lt;behavior&gt; &lt;webHttp /&gt; &lt;/...

    创建WCF Restful

    &lt;behavior&gt; &lt;!-- 为了防止泄露元数据,取消注释以下行 --&gt; &lt;!-- &lt;serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" /&gt; --&gt; &lt;serviceDebug includeExceptionDetailInFaults="false" /&gt; &lt;/behavior...

    WCF + RESTful + 基本认证

    &lt;extension element=&lt;your_custom_behavior_extension/&gt; /&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;/behaviors&gt; &lt;/system.serviceModel&gt; ``` `WebHttpBehaviorExtensions-master` 这个文件夹很可能包含了实现这个...

    MSDN杂志 2008年新产品特刊

    本期的主要内容:&lt;br&gt;&lt;br&gt;移动 WCF: 使用 .NET Compact Framework 编写 IM 应用程序&lt;br&gt;.NET Compact Framework 3.5 是 Windows Communication Foundation (WCF) 的功能子集,可以用来控制 Windows Mobile 设备与...

    wcf 跨域 post方式

    &lt;behavior name="webBehavior"&gt; &lt;webHttp defaultOutgoingResponseFormat="Json" /&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;/behaviors&gt; ... &lt;/system.serviceModel&gt; ``` 3. **添加跨域支持**:在WCF服务中,...

    spring.net+Nhiberate实现WCF服务层

    &lt;object id="wcfService" type="YourNamespace.WcfService, YourAssembly"&gt; &lt;property name="SessionFactory" ref="sessionFactory" /&gt; &lt;/object&gt; &lt;/objects&gt; ``` 接下来,我们需要创建NHibernate的配置文件(如...

    WCF双向认证

    【WCF双向认证】是指在Windows Communication Foundation (WCF)服务和客户端之间使用X.509证书进行安全通信的一种方式。这种认证模式确保了服务和客户端双方的身份都被验证,提高了通信的安全性。 **实现原理** WCF...

    安卓与wcf通信 json实现

    &lt;behavior name="webBehavior"&gt; &lt;webHttp defaultOutgoingResponseFormat="Json" helpEnabled="true" /&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;serviceBehaviors&gt; &lt;behavior&gt; &lt;!-- 忽略此处的其他配置 --&gt; &lt;/...

    Wcf ajax c#例子

    &lt;behavior name="ajaxBehavior"&gt; &lt;webHttp defaultOutgoingResponseFormat="Json" /&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;/behaviors&gt; &lt;services&gt; &lt;service name="YourNamespace.WcfAjaxService"&gt; &lt;endpoint...

    WCF序列化案例

    在WCF服务配置文件(.config)中,可以通过修改`&lt;bindings&gt;`和`&lt;behaviors&gt;`元素来指定使用的序列化器。例如,使用以下配置启用DataContractSerializer: ```xml &lt;bindings&gt; &lt;basicHttpBinding&gt; &lt;binding name=...

    Ajax连接WCF

    &lt;behavior name="webBehavior"&gt; &lt;webHttp/&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;/behaviors&gt; &lt;/system.serviceModel&gt; ``` **4. 使用Ajax调用WCF服务** 在客户端,我们通常使用JavaScript库如jQuery来实现Ajax...

    一个非常简单的WCF例子:Hello World

    一个非常简单的WCF例子:Hello World 本解决方案有3个项目: 1、WCFClient:客户端,展示通过wcf后得到的结果,一个小的winform; 2、WCFContrlPanel:主控程序,作为打开/关闭wcf服务的控制面板,winform; 3、...

Global site tag (gtag.js) - Google Analytics