1、绑定模型。
WCF整个基础框架有服务模型层和信道层组成,服务模型层建立在信道层之上,对于客户端,服务模型层经过序列化生成的消息传入到信道层进行相应的处理后分发出去,信道层接收消息后,经过处理后传入到服务模型层。对于服务端,信道层安装相对的方式处理请求消息和回复消息。信道层就是信道按照一定的顺序组成的信道栈。
1)、信道与信道栈
WCF消息传输的是通过信道栈传输的,WCF最基本的信道栈包括传输信道和消息编码信道,传输信道是用来传输消息的,而消息编码消息是处理消息的,应用程序把数据通过消息的方式传入消息编码信道进行处理,处理完成以后传入传输信道进行传输,另外一端通过传输信道接收消息,然后传入到消息编码信道进行处理,然后把处理结果传给应用程序。
在WCF信息传输中,消息编码信道可以没有,但是传输信道一定要有的,另外,在传输消息的时候,WCF可以添加其他信道来对消息进行可靠安全的传输:
- 事物流转(Transaction Flowing):从客户端开始的事务流转到服务端,从而将服务的执行纳入该事务中。
- 安全传输(Transfer Security):保证数据包或消息的安全,同事解决客户端和服务认证问题。
- 可靠传输(Reliable Messaging):保证数据包或消息在网络环境有序传输,不丢失数据。
比较完整的WCF信道传输方式:WS-ST channel(自动事务)<---->WS-RM channel(可靠传输)<---->WS-Security(安全传输)<----->encoding channel (消息编码信道)<---->Trasnport channel (传输信道) <————>Trasnport channel (传输信道)---->encoding channel (消息编码信道)---->WS-Security(安全传输)<----->WS-RM channel(可靠传输)<---->WS-ST channel(自动事务)
2)、WCF的绑定模型:
组成信道栈的各个信道按照功能上可以划分为以下几种:
a、传输信道:实现了基于某种网络协议的消息传输。
b、消息编码信道:实现了对消息的编码,常见的消息编码方式有Text/XML,binary和MTOM。
c、协议信道:实现了WCF对若干WS-*协议的支持。
在WCF中信道由信道管理器创建,信道管理器又由绑定创建,信道管理器就是信道监听器和信道工厂的统称,在客户端,信道管理器就是信道工厂,在服务端就是信道监听器,绑定是由绑定元素按照一定的顺序组成的,绑定元素的次序不一样,绑定就不一样,绑定上下文(BindingContext)维护着基于该绑定对象当前绑定元素的有序列表。
2、信道和信道栈。
1)、CommunicationObject类:
ICommunicationObject是所有通信对象的管理接口,最基本的最基本的接口,所有通信对象的最终都是继承自这个接口,这个接口有一个直接子类,CommunicationObject抽象类,信道工厂、信道管理器、信道基类等等都是继承自CommunicationObject抽象类,ICommunicationObject接口中包含事件有:Closed,Closing,Opened,opening,faulted,分别对应着关闭,打开和故障时激发,还包含Open方法CLose()方法同步异步的两种,还有一个CommunicationState 的state属性,表示通信对象的状态。
IDefaultCommunicationTimeouts接口,所有通信对象通过继承这个接口,实现操作超时的操作。
IChanel,所有信道的基接口,该接口一个抽象子类ChannelBase类,这个类是所有信道类的基类,
public abstract class ChannelBase:CommunicationObject,IChannel,ICommunicationObject,IDefaultCommunicationTimeouts
{
public virtual T GetProperty<T>() where T:class;
protected ChannelBase(ChannelManagerBase channelManager);
TimeSpan IDefaultCommunicationTimeouts.CloseTimeout{get;}
TimeSpan IDefaultCommunicationTimeouts.OpenTimeout{get;}
TimeSpan IDefaultCommunicationTimeouts.ReceiveTimeout{get;}
TimeSpan IDefaultCommunicationTimeouts.SendTimeout{get;}
}
4)、消息交换模式:
比较典型的消息交换模式分为三种:数据报模式、请求-回复模式、双工模式。
a、数据报模式(Datagram):最简单的消息交换模式,又称发送/遗忘或单向模式,发送方式:消息发送方--------------->消息接收方。
b、请求-回复模式(Request-Reply):使用最多的一种方式,一般采用同步的方式,消息发送过去以后,会等待对方的回复:消息发送方<==================>消息接收方。
c、双工模式(Duplex):双方都可以向对方发送消息,比较典型的双工通信模式是订阅/发布模式。消息发送方<------------------>消息接收方。
消息的交换是依赖于网络传输的,TCP协议默认就支持双工通信,基于HTTP协议,是不支持双工的,基于WSDualHttpBinding的双工通信,是采用了两个关联的HTTP通道实现的。
5)、信道形状:
信道的形状决定了信道的作用,不同的消息交换模式下,信道的形状是不一样的,同一个模式下,消息的接收方和发送方信道的形状也不一样。
MEP 消息发送方 消息接收方
数据报 IOutputChannel IInputChannel
请求/回复 IRequestChannel IReplyChannel
双工 IDuplexChannel IDuplexChannel
a、IOutputChannel/IInputChannel:
a)、IOutputChannel,接口定义了Send方法,同步的和异步的两种,以及包含超时参数的重载方法。
这个接口里的两个属性:RemoteAddress 指的是服务端的服务终结点地址(逻辑地址),另一个Via是物理地址。
b)、IInputChannel,接口定义了Receive方法,同步和异步的两种,以及包含超时参数的重载方法,另外,Receive方法和TryReceive方法返回Message类型的消息。
b、IRequestChannel/IReplyChannel:
a)、IRequestChannel,接口定义了Request方法,同步和异步的两种,以及包含超时参数的重载方法,
这个接口里的两个属性:RemoteAddress 指的是服务端的服务终结点地址(逻辑地址),另一个Via是物理地址。
b)、IReplyChannel,接口定义了ReceiveRequest方法,同步和异步的两种,以及包含超时参数的重载方法,其中ReceiveRequest方法和TryReceiveRequest方法返回RequestContext类型的对象,RequestContext是请求上下文的意思,这个类的RequestMessage属性代表接收的消息,可以通过RequestContext的Repley方法把回复的消息发送给客户端。
c、IDuplexChannel:这个类继承自IInputChannel、IOutputChannel接口,和数据报模式的一样,不一样的是,双工通信,发送方和接收方信道形状一样。
6)、会话信道:
从状态保持的角度,信道分为数据报信道和会话信道,前者不要保持具体的客户端,因此多个客户端对象可以使用相同的信道,后者则绑定了一个客户端对象,并且和客户端对象有相同的生命周期。
ISession接口,里面一个Id属性,表识一个会话,对于上面讲的不同形状的信道,都有各自对应的会话接口,如:IInputSession,IOutputSession,IDuplexSession。
ISessionChannel<TSession>,会话机制是通过会话信道栈实现的,所有的信道直接或间接的实现了System.ServiceModel.Channels.ISession<TSession>接口,泛型TSession实现ISession接口。
浙公网安备 33010602011771号