WCF全面解析(上下册)[试读]
3.1.1 信道与信道栈
信道与信道栈 在信道层,若干信道首尾相连组成一个管道,我们将其称为信道栈。WCF采用基于消息的通信手段,信道栈提供一个消息传输和处理的通道。关于信道栈处理消息的方式,我们可以通过自来水厂的净水流程做一个类比。 有一个为居民提供饮用水的自来水厂,它的任务就是抽取自然水源,进行必要的净化处理,最终输送到居民区。净化处理的流程可能是这样的:天然水源被汲取到一个蓄水池中先进行杂质的过滤(过滤池),被过滤后的水流到第二个池子中进行消毒处理(消毒池),被消毒处理的水流到第三个池子中进行水质软化处理(软化池),最终水通过自来水管道流到居民的家中。 WCF中信道栈就相当于一个自来水厂,而构成信道栈的一个... 查看全部[ 3.1.1 信道与信道栈 ]
3.1.2 实例演示:直接通过绑定进行消息通信
实例演示:直接通过绑定进行消息通信 信道层由相关信道经过有序组合而成的信道栈构成,但是并不是说整个绑定模型中只有绑定和信道两种对象。我们说信道层是由绑定创建的,也不是说通过绑定直接创建信道。对于整个绑定模型,除了绑定以及它的最终产品(信道栈)之外,还具有额外一些对象。 既然绑定的最终目的就是创建用于处理和传输消息的信道栈,就意味着我们可以直接通过绑定实现基于消息的通信。为了让读者对绑定模型有一个深刻的印象,同时也作为一个引子引出整个绑定模型的组成元素,我们来演示一个直接通过绑定进行消息通信的例子。整个实例的解决方案由图3-3所示的两个控制台程序构成,它们分别用于模拟消息的接收方和发送方。 ... 查看全部[ 3.1.2 实例演示:直接通过绑定进行消息通信 ]
3.1.3 WCF的绑定模型
WCF的绑定模型
在上面的实例演示中,我们通过简单的几行代码就完成了一个完整消息交换过程。这个例子涉及了一系列重要的对象,比如信道(Channel)、信道监听器(ChannelListener)、信道工厂(ChannelFactory)等,这些是整个绑定模型构成不可或缺的元素,它们相互协作组成了如图3-4所示的绑定模型。
...
查看全部[ 3.1.3 WCF的绑定模型 ]
3.2.1 CommunicationObject
CommunicationObject WCF绑定模型涉及多种类型的组件,比如信道、信道监听器、信道工厂等。从功能上讲,这些对象都是为通信服务的,可以把它们称为通信对象(Communication Object)。对于这些通信对象来说,它们具有相同的状态和状态转换方式(状态机),所以WCF提供了具有如下定义的System.ServiceModel.ICommunicationObject接口来统一管理通信对象的状态机。 public interface ICommunicationObject { //事件 event EventHandler Closed; ... 查看全部[ 3.2.1 CommunicationObject ]
3.2.2 DefaultCommunicationTimeouts
DefaultCommunicationTimeouts 较之一般意义上的方法调用,通信操作往往需要花费较长的时间。对于一个通信对象来说,如果针对它的某个方法调用在一段较长的时间内还没有返回,我们不可能无条件地等待下去,所以超时处理对于通信对象来说显得尤为重要。 通信对象的很多方法调用都会设置一个超时时限。回顾一下ICommunicationObject接口用于开启通信对象的Open方法,我们会发现它具有两个重载,其中一个具有TimeSpan类型的timeout参数,另一个则没有。这里的timeout参数实际上代表Open方法执行的超时时限。如果Open操作执行的时间过长,一旦超过了设定的... 查看全部[ 3.2.2 DefaultCommunicationTimeouts ]
3.2.3 IChannel和ChannelBase
IChannel和ChannelBase 每一种类型的信道都直接或者间接地实现了System.ServiceModel.Channels.IChannel接口。如下面的代码所示,IChannel仅仅具有一个唯一的GetProperty<T>方法用于返回信道具有的指定类型的属性。这个方法比较重要,因为它是探测信道是否具有某种能力或特性的一种有效的方法。比如可以通过该方法确定信道是否支持某种消息版本。 public interface IChannel : ICommunicationObject { T GetProperty<T>() where T :... 查看全部[ 3.2.3 IChannel和ChannelBase ]
3.2.4 消息交换模式
消息交换模式 消息交换模式(Message Exchange Pattern,MEP)在SOA中是一个重要的概念。在W3C的文献中MEP的官方定义是这样的:MEP定义了参与者进行消息交换的模板(a template that describes the message exchange between messaging participants)。我们这样来理解MEP:消息交换模式(MEP)代表一系列的模板,它们定义了消息的发送者和接收者相互进行消息传输的次序。比较典型的消息交换模式包括数据报模式(Datagram)、请求-回复模式(Request-Reply)及双工模式(Duplex)。... 查看全部[ 3.2.4 消息交换模式 ]
3.2.5 信道形状
信道形状 信道是消息交换的管道,在不同的消息交换模式下信道在发送端和接收端所起的作用是不同的。在数据报模式下,发送端信道栈的作用是输出(Output)数据报,接收端则是输入(Input)数据报;对于请求-回复模式来说,发送端的作用是发送消息请求(Request),而接收端则是回复(Reply)请求;而在双工通信模式下,消息交换双方的地位完全是等价的,它们都具有输出(Output)和输入(Input)的功能。 WCF通过信道形状(Channel Shape)表示不同的消息交换模式对消息交换双方信道的不同要求,并定义了相应接口来规范基于不同信道形状的信道应该具有的操作。这些接口包括IOutpu... 查看全部[ 3.2.5 信道形状 ]
3.2.6 会话信道
会话信道 从状态保持的角度,可以把信道分为数据报信道(Datagram Channel)和会话信道(Sessionful Channel)。前者不需要保持具体的客户端(服务代理)的状态,因此多个客户端对象可以使用相同的信道;后者则绑定一个客户端对象,并且与客户端对象具有相同的生命周期。 WCF中的会话(Session)表示在进行通信的参与者之间共享的上下文,会话通过消息关联(Message Correlation)的方式来实现。所谓的消息关联,就是将发送自相同客户端的消息通过一个会话ID关联在一起。关于会话,在本册的第9章“实例化与会话(Instancing and Session)”中有... 查看全部[ 3.2.6 会话信道 ]
3.2.7 实例演示:自定义信道
实例演示:自定义信道 WCF是一个极具扩展性的通信框架,不论是在服务模型层还是信道层都具有很多扩展点。信道层的可扩展性主要体现在可以通过自定义信道的方式实现针对消息的某种处理功能,比如可以创建压缩信道对发送的消息进行压缩以降低网络流量。自定义的信道并不实现针对消息的具体处理,而是在控制台中将当前调用的方法名称打印出来。当把信道应用于真正的WCF应用时,可以根据打印出来的类型知道具体执行的方法和执行的先后顺序。 创建自定义信道基类 现在我们为接下来需要创建的请求信道、回复信道和双工会话信道创建一个基类,并起名为SimpleChannelBase。如下面的代码片段所示,SimpleChann... 查看全部[ 3.2.7 实例演示:自定义信道 ]
3.3.1 IChannelListener与ChannelListenerBase
IChannelListener与ChannelListenerBase 信道监听器实现了接口System.ServiceModel.Channels.IChannelListener。如下面的代码片段所示,IChannelListener继承自ICommunicationObject接口。WaitForChannel和BeginWaitForChannel/EndWaitForChannel方法用于检验信道(栈)创建/获取的可行性。这两个方法会试图创建一个新的信道(栈)或者获取一个现有的信道(栈),如果在规定的时限范围内新的信道(栈)创建成功或者现有的信道(栈)被成功获取,则方法返回Tru... 查看全部[ 3.3.1 IChannelListener与ChannelListenerBase ]
3.3.2 信道栈的创建/使用模式
信道栈的创建/使用模式 信道监听器一旦探测到抵达的请求,就会使用所创建的信道栈对请求消息进行接收处理。但是信道的创建和使用模式对于数据报信道(Datagram Channel)和会话信道(Sessionful Channel)是完全不同的。 数据报信道监听器:信道监听器开始监听的时候就已经通过调用AcceptChannel方法创建了信道(栈)。这个被事先创建的信道(栈)被用于所有请求消息的接收和回复消息的发送。 会话信道监听器:信道监听器创建的信道栈不是共享的,而是被某个客户端独占使用的。会话信道栈是在某个客户端的第一次请求被接收到的时候创建的,它被专门用于处理来自该客户端的后续... 查看全部[ 3.3.2 信道栈的创建/使用模式 ]
3.3.3 实例演示:自定义信道监听器
实例演示:自定义信道监听器 在前面一个实例演示中,我们创建了SimpleReplyChannel和SimpleDuplexSessionChannel这两个自定义信道。前者在请求-回复模式下以数据报形式在服务端实现对请求的接收和回复的发送,后者则是一个支持会话的双工信道。现在我们分别为它们创建相应的信道监听器。 创建自定义信道监听器基类 我们先来创建一个抽象的SimpleChannelListenerBase<TChannel>,它将作为接下来创建的数据报信道监听器和会话信道监听器的基类。如下面的代码所示,SimpleChannelListenerBase<TChann... 查看全部[ 3.3.3 实例演示:自定义信道监听器 ]