WCF 扩展之我见: 开篇

WCF 是一个扩展性很强的分布式通信框架,网上也有很多文章介绍,比如博客园 Artech 的 <WCF 后续之旅>,国外 Carlos 的 <WCF Extensibility> ,以及 MSDN 的 <Extending WCF> 。既然如此,是否还有意义重复造车轮?本人认为是有的,首先本系列不是对以上作者文章的搬运或翻译,更多的是基于以上作者的成果,结合自己对 WCF 源码的阅读和实践,经过自己思想沉淀后的分享。除了进一步巩固自己对 WCF 的理解外,也为其他朋友提供另一种角度的理解。


本文作为系列的开篇,会简单介绍下 WCF 的可扩展性及关键的一些模型和对象,并在文末给出本系列的索引目录。


可扩展性介绍

微软设计 WCF 的目的就是为了使其能服务于各种分布式的 SOA 应用场景。考虑到用户使用 SOA 场景的各不相同,微软把主动权留给了开发人员,在分布式通信的各个的层次上都提供了可扩展点(甚至是替换默认的实现方式),从而让开发人员可以通过扩展实现不同场景的需求。

但也是因为微软提供了太多的可扩展点(30多个),使得开发人员很难决定什么时候使用哪个扩展点,这也是本系列想要解决的一个问题。



两种编程模型

结合 WCF 的体系结构,扩展点主要集中在两个层次:Service Model Layer 和 Channel Layer,用一张图来描述下:

Channel Layer 主要用来进行消息的交换(发送和接收):在 Server 端,它会把从网络上接收到的数据从最底层的 transport channel 开始逐层网上传递;在 Client 端,她会把一个消息对象逐层往下传递,并最终变成二进制数据发送到网络上。这点像传统的 TCP/IP 协议栈,但是它的功能远非只是把二进制数据与消息进行互相转换,还可以通过添加 Security Protocal,Reliable Protocal 等来对消息的安全性,可靠性及其他方面进行处理。

Service Model Layer 则是用于在 Channel Layer 处理完消息后,把消息分发到对应的 Operation。在此过程中,该层会负责创建服务实例,把一个消息对象转换成方法需要的参数,并最终调用对应的方法来执行操作,及把返回值封装成消息对象等。

一般情况下,可以使用 Service Model Layer 扩展解决的问题就尽量不要使用 Channel Layer,因为对 Service Model Layer 的扩展可以使用我们熟悉的 OO 方式,而 Channel Layer 则更多的要求对消息本身的结构有所了解,学习曲线长。


除了这两个层次之外,还可以对 Security,Metadata,Serializer 进行扩展。


更多信息,请参考《Data Transfer Architectural Overview


核心对象

对 WCF 的扩展,其本质上是修改了运行时对象的属性值,而这些对象中最为重要的有2个:


DispatchRuntime

分发运行时,是 WCF 的核心对象,主要用于 Service Model Layer。通过该对象,一个由 Channel Stack 接收到的消息才能最终转变为对某个方法的调用。也是因为该对象提供了诸多扩展点,才让开发人员能根据自己的需求进行自定义。

*注,每个 Endpoint 都有属于它自己的 DispatchRuntime。


DispatchOperation

分发操作,根据服务契约的不同,一个服务可能会有多个 Operation,因此一个 DispatchRuntime 也会有多个 DispatchOperation。如果说 DispatchRuntime 负责了整体的消息调度,那 DispatchOperation 则负责了具体某一个 Operation 的调度 (解析参数,调用 Operation 对应的方法等)。


除此之外,ChannelDispatcher,EndpointDispatcher 都在整个 WCF 运行时中起到了至关重要的作用。现在,如果对这两个对象的作用还不是很清楚,请不要着急,在之后的系列文章中会经常提到它们。


最后,献上一张国外网友分享的类图,直观得体现了上述这几个对象之间的关系:

<WCF-DISPATCHER GRAPHICS>


上面介绍的两个对象属于服务端对象,与之对应的客户端对象为 ClientRuntime 和 ClientOperation。

系列索引

从后续的文章开始,我将对每一个扩展点进行单独介绍。根据上面说的,主要会分为两块内容:Service Model Layer 和 Channel Layer,其中会穿插几篇概念性的文章。考虑到 Service Model Layer 是我们主要的扩展方式,因此会先介绍。除了这两部分外,我还会介绍下其它的一些扩展点。

初步的索引如下(随着文章的完善而更新):


索 引

WCF 消息处理流程

Service Model Layer

    Behaviors

    MessageFilter

    InstanceContextProvider

    InstanceContextInitilizer

    OperationSelector

    DispatchMessageInspector

    InstanceProvider

    CallContextInitilizer

    DispatchMessageFormatter

    ParameterInspector

    OperationInvoker

    ErrorHandler

    IExtension/IExtensibleObject<T>

    ServiceHost/ServiceHostFactory

Channel Layer

    Channel

    ChannelListener/ChannelFactory

    Message Encoder

Binding

Serialization

Metadata

Security

    

最后再放上一张图片来直观的表述下服务端的扩展点:

此图源自微软 MSDN


文章索引

[隐 藏]

本站采用知识共享署名 3.0 中国大陆许可协议进行许可。 ©2014 Charley Box | 关于本站 | 浙ICP备13014059号