为了支持服务端的本地特性,WCF定义了行为的概念。一个行为,就是本地的服务特性,他不会影响到服务的通信模式。ServiceBehaviorAttribute的InstanceContextModel属性是控制服务上的实例模式。
单调服务(InstanceContextModel.PerCall)
特点:每次Client代理请求,WCF都会创建一个服务实例,调用完后销毁。
1、传统的C/S模式,每个Client长期占用一个Service实例,这样服务端很浪费资源,只能支持为数不多的Client。
2、PerCall是根据需求才创建实例,而且在调用方法后立即销毁。所以Service会少于Client,可以支持更多的Client。
3、单调服务需要load状态,销毁时保存状态,状态共享比较适合分布式负载均衡(Load-balancing)
4、客户端不必去Dispose或ClearUp,这是服务端的工作。
5、单调服务具有良好的可伸缩性和对事物的支持
6、PerCall类似于Remoting的SingleCall
会话服务(InstanceContextModel.PerSession)
特点:和传统的CS模式一样,Client发出请求和Service建立独立的持久的连接,直到Client关闭。Service和Proxy共同持有一个Session。
1、InstanceContextModel 默认是PerSession模式。
2、关闭Proxy时,客户端异步调用Dispose,销毁实例。
3、NetTcpBinding和NetNamedPipeBinding,WCF会关联客户端的连接。
4、BaseHttpBinding无法保持会话。
5、WsHttpBinding可以通过信息头的SessionId来模拟传输层会话,因为SessionId是唯一的。
6、ServiceContract(SessionModel.Allowed | Required | NotAllowed) 默认是Allowed
7、若要设计一个会话契约,推荐使用Required
8、NotAllowed 禁止会话层传输,此时要把InstanceContextModel设为PerCall
9、配置一致性,如果服务时限的其中一个契约是会话契约,其他契约最好也是会话契约。
10、InstanceContextModel为PerCall,则SessionModel无效。SessionModel设为NotAllowed,则为PerCall
11、Service通过OperationContext.Current.SessionId获取 Client通过Proxy.InnerChannel.SessionId获取
12、PerSession同理与Remoting的客户端激活模式
单例服务(InstanceContextModel.Singleton)
特点:单例服务是一种极端的共享式服务,所有的客户端都将独自连接相同的实例(Well-Known),其生存周期是无限的,只有在关闭宿主时才会被释放。
1、单例服务不需要客户端维护单例实例的会话,也不需要使用支持传输层会话的绑定。
2、同一时间内只能有一个客户端能够访问单例服务。
分布操作(Demarcating Operation)
为了方法的有步骤的执行,WCF允许契约设计者制定契约操作为启动或终止的会话操作。使用OperationContract的特性IsInitiating和IsTerminating划分会话的执行步骤。
1、分布操作支持PerSession和Singleton模式。
2、IsInitiating默认为true IsTerminating默认为false
3、IsTerminating被设为true,则该方法执行完后终止会话,相反则持续会话。
实例停用(Context Deactivation)
限流(Throttling)