WCF中的实例管理和并发管理
在WCF中可以将所有的客户端请求消息发送到同一服务上,也可以为每个客户端分配一个新的服务对象,实例管理属于一种服务行为,实例管理通过ServiceBehavior特性的InstanceContextMode属性进行设置,概述性的类型为InstanceContextMode枚举类型,他一共包含三个之分别为PerSession,PerCall,Single;
PerCall实例策略
当服务采用了PerCall策略时,每个客户端请求消息都会被发送到一个新的服务实例上,而一旦这个调用返回之后,服务实例则会被销毁,采用PerCall策略时因为服务类型使用了较为昂贵的资源,例如数据库联接,网络文件,如果不采用,则将会长期占用这些资源.
PerSession实例策略
PerSession是默认的实例策略,他代表了会话的实例管理模式,会话管理相对较为负责,仅仅设置服务行为是不够的, 需要满足三个方面的需求才能在客户端和服务端之间会话,这三个方面是:1)服务契约的会话设置,2)服务行为的实例模型设置,3)绑定的选择, 一旦这些方面的设置都服务会话要求,会话策略将被使用,服务端会为每个客户端代理分配一个新的服务实例,而且该服务实例在客户端代理打开期间都存活,当客户端代理被关闭时,会主动的发送消息异步的调用服务器实现Dispose方法.
服务契约的会话设置:服务契约的会话设置通过ServiceContract的SessionMode属性设置,他为枚举类型,有四个值分别为Allowed ,Required ,NotAllowed,Allowed是默认的服务契约配置,一旦设置了该值,意味着服务器允许与客户端建立会话通信,也就是说,当服务行为的实例模式设置绑定的选择符合会话要求时,通信双方就会采用会话的模式进行交互,每个客户端代理都能获得一个服务类型的实例,并且在代理打开期间都有效。Required是指服务端要求使用会话模式,这样设置限制了绑定的选择,寄宿程序和客户端必须选择提供传输层会话的绑定来进行消息交互,否则会话会产生异常,当服务契约设置为Required后,服务行为仍然可以设置为PerCall模式,这时实例管理仍将采用PerCall方式。而allowed和NotAllowed刚好相反,服务段不允许与客户端建立传输层的会话,也就是说,一旦在服务契约中定义为NotAllowed,那就不能使用netTcpBinding,NetNamedPipeBinding,否则将导致异常。
绑定的选择:会话管理模式需要解决的主要问题是把同一客户端代理发送的消息关联到同一服务实例上,也就是说,服务端需要有能力识别不同客户端的代理,一般来说,这一问题依靠传输层协议的会话能力来实现的,也就是说依靠绑定来实现的。 对于那些不具备传输层会话能力,也不能模拟会话的绑定,无法适用与会话实例管理模式.
Single实例策略
Single实例策略非常类似与设计模式中的单间模式,所有的客户端代理发送的消息都会被对应到同一个服务实例上,该实例在宿主打开时便别初始化,并且该实例将始终存活直到服务被关闭。
并发管理
实例管理包含了如何为不同的客户端生成服务实例,以及何时创建以及销毁实例,而并发管理则包含了如何管理被关联到同一服务实例的不同消息,并发的概念也可以理解为多线程,
并发管理的设置和实例管理一样,并发管理也通过服务行为的属性来设置,并发管理的属性名为CurrencyMode,他为枚举类型包含三个值,分别为Single,Reentrant和Multiple。根据不同的实例管理模式,对并发的需求也不是相同的,对于PerCall模式来说,任意一个客户端代理的任意一次访问都会导致一个新的实例被创建, 则任何一个服务实例都是被单线程访问的,这里不需要任何并发管理,而对于PerSession模式和Single模式来说,一个服务实例有可能被多个线程访问,对于这样的服务,需要根据不同的设置不同的管理。
Single并发模式:并发模式默认模式,当设置了Single模式后,WCF会为服务实例的操作提供同步锁, 每个进入服务实例的操作都必须先获得锁,所以该模式下能够确保任何时候只有一个线程在执行服务操作。当有多个客户端试图同时访问服务操作时,这些请求会被放入到一个排队队列中,并且依次进入服务实例操作,在排队过程中,一旦有某个请求超时,则会得到一个异常。
Multiple并发模式:Single并发模式比较极端,等同于在整个操作上使用了同步锁,使用Multiple他表示WCF不会为服务操作添加任何锁,每个操作都允许客户端多个请求同时访问,这样做可以提高系统运行的效率,防止消息被阻塞.
Peentrant并发模式:他于Single模式一样,在同一时间只允许一个线程访问服务操作,在访问进入操作之前必须获得同步锁,所不同的是,他解决了single模式死锁问题。