1、实例模型的配置
ServiceBehaviorAttribute控制这个设置
2、Per Call服务
为每个调用创建新的服务对象,增加了整体的吞吐量,状态不会在多次调用中存在,
服务实例被释放,内存开销小,不会产生并发问题
PerCall的体系结构
无状态调用,为每个请求分别实例化业务逻辑和数据层,不存在并发性问题,无状态调用可以共享缓存的内容,引入并发性问题
InstanceContextMode.PerCall
3、Per Session服务
会话(Session)
wcf有四种类型的会话:传输会话如TCP或者命名管道,可靠性会话,安全会话,应用程序会话例如PerCall,PerSession,单例
wcf的会话由客户端发起,asp.net的会话由服务器端初始化
PerSession模式
默认为每个客户端/代理创建新的服务对象,吞吐量较少,内存开销增大,状态由服务实例维护,引发多线程客户端的并发问题
PerSession体系结构
有状态调用,每个会话可以缓存下游的业务数据和数据层,
多线程客户端及其之间存在并发性问题,
状态与会话紧密联系,而不是业务逻辑层
PerSession模式
仅当绑定支持会话时,才能够支持会话,可以支持会话的绑定
NetTcpBinding,NetNamedPipeBinding,WSHttpBinding,WSFederationBinding,WSDualHttpBinding
basicHttpBinding不支持会话
配置PerSession
InstanceContextMode.PerSession
配置会话
在服务契约上需要设置能够提供会话功能,SessionMode枚举 Allowed(缺省),NotAllowed,Required
receiveTimeout 是session的过期时间
会话ID(SessionID)
任何形式的会话都会生成会话通道
会话标识符用于将消息与正确的信道相关联,在会话的整个生命周期中起作用
会话的生命周期
会话的生命周期缺省为持续10分钟
在每个帮顶上可以通过receiveTimeout 设置
可以通过操作显示的控制生命周期,通过设置OperationContractAttribute的IsInitiating与IsTerminating属性
4、单件服务
为所有的客户端的所有的调用创建单一的服务对象
通常会给吞吐量带来负面影响
潜在的较多内存开箱,单一的大对象
状态由服务的实例维护,并发性问题
配置单件
InstanceContextMode.Single
单件的体系结构
无状态单件
下游的业务逻辑和数据层能被所有的请求共享
会话总结
PerCall适用于高扩展性和高吞吐量的业务
PerSession注意会话所带来的开销和潜在的超时问题
通常避免使用单件模型,除非当多台客户端主机共享某个功能的时候非常有用