天天看点

WCF 实例化与会话

实例管理旨在解决服务实例的激活和服务实例生命周期的控制,会话的目的是在于保持相同客户端(服务代理)多次服务调用的状态。

实例上下文

实例上下文是对服务实例的封装,是wcf管理服务实例生命周期的依托,system.servicemodel.instancecontext

实例上下文模式

可以简单的理解为服务端的服务实例与客户端的服务代理之间的关联方式。有以下三种:

1 单调模式:对于每个服务调用,不论是相同还是不同的客户端,wcf总是创建一个全新的服务实例和实例上下文对象来处理服务调用请求,当服务操作执行完毕后,实例上下文对象和被封装的服务实例被回收。

2 会话模式:会话的目的在于保持来自相同客户端多次服务调用之间的状态。在会话实例上下文模式下,wcf为每个服务代理对象分配一个单独的服务实例上下文对象,来自相同服务代理的所有服务调用请求,都将分发给相同的服务实例上下文处理。

3 单例模式:wcf为每个服务维护一个并且仅维护一个服务实例上下文。

通过servicebehaviorattribute特性的instancecontextmode属性进行实例上下文模式的设置。

客户端识别机制

会话是基于客户端和服务的,对于不同的传输协议,wcf采用的客户端识别机制是不同的。

1 传输会话 tcp是基于连接的通信协议,天生就具备会话的特性,tcp连接就是通信双方会话的体现,我们将传输提供原生支持的会话称为传输会话,基于tcp和ipc(通过命名管道提供的跨进程通信)的会话均属于传输会话。

2 非传输会话 http是无状态的,本身不可能实现针对客户端的识别的,只能将客户端标识置于消息之中,让服务据此识别客户端,wcf在请求消息中添加一个会话id号来解决客户端的识别问题。

会话模式

system.servicemodel.sessionmode枚举表示会话模式,allowed,required和notallowed三个枚举分别表示允许,强制和不允许使用会话。        

用于定义服务契约的servicecontractattribute特性具有一个sessionmode属性用于定义采用的会话模式

会话的初始与中止

operationcontractattribute具有两个布尔类型的isinitiating和isterminating属性分别用于定义初始和终止会话的操作。

如果会话尚未开启, isinitiating属性被设置为true的操作的调用会自动开启会话,而当isterminating属性为true的操作被调用之后,当前会话会被关闭。isinitiating和isterminating属性的默认值分别为true和false。

会话模式,绑定与实例上下文模式

1 如果采用单调实例上下文模式,服务实例上下文的提供方式总是基于每次的服务调用的,所以采用单调实例上下文模式的服务永远是单调服务。

2 单例服务决定于单例实例上下文模式

3 会话服务由会话模式,绑定和实例上下午模式三者决定