本篇主要介绍WCF服务的生命周期,以及通过配置来控制处理客户端请求的服务实例的建立和销毁的时机。
WCF共有三种方式来控制服务端实例的生命周期:
1.PreCall方式
对于客户端的每一个请求,服务端即生成一个实例。请求结束后释放服务端实例。
工作流程如下:
1)客户端创建代理对象(Proxy)
2)客户端调用代理对象的一个契约操作,代理对象将其传递给宿主程序
3)服务应用程序创建一个新的服务契约对象,并执行请求的操作
4)在执行完请求的操作后,如果要求有应答,那么服务契约会给代理对象一个应答,然后销毁自己(如果实现了IDisposable,则调用Disposs函数)
2.PreSession方式
根据每个Client生成一个实例,当客户端代理关闭的时候才释放服务端实例。
工作流程如下:
1)客户端创建代理对象(Proxy)
2)客户端第一次调用代理对象的一个契约操作,代理对象将其传递给宿主程序
3)宿主程序创建新的服务对象,并执行请求操作,如果有必要,返回客户端应答。
4)客户端再次发出调用服操作的请求,宿主会先判断是否已有建立好的会话,如果存在,则不需要再创建新的服务对象,直接使用老对象即可
5)在时间达到指定要求或者因一些特殊原因,会话会过期,此时服务对象销毁
3.Single方式
服务端只生成一个实例来对应所有Client的请求,类似于单例模式。
1)服务端启动,同时创建服务对象
2)客户端通过代理调用契约操作
3)第一步中创建的服务对象接受请求,并执行操作,进行必要的应答
4)第一步创建的服务对象将一直保留
5)服务关闭,第一步创建的对象销毁
WCF三种生命周期的实现:
1.客户端代码
客户端和调用一般的WCF一样,本例新建了两个客户端代理类,一个代理类调用五次服务端的操作,一个代理调用了三次服务的操作。之所以建立两个代理类,是为了形成两个Session,使得前五次调用和后三次调用处于不同的Session中。
客户端主要代码如下:
2.服务端代码
服务端只需要在实现契约操作的类之上申明InstanceContextMode即可,其余做法与普通WCF服务的做法相同。
InstanceContextMode的设置见下图:(各个函数和变量的介绍见代码中的注释)
WCF三种生命周期的验证:
1.PreCall的验证
首先设置[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)],然后运行WCFLifeCycle.sln。
1)客户端结果如下:
客户端两个代理类共调用WCF服务8次,有两个Session。
2)服务端结果如下:
服务端每次被调用时都新建一个实例,完成请求后销毁实例,共8次,与客户端的请求次数一致。
2.PreSession的验证
首先设置[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)],然后运行WCFLifeCycle.sln。
1)客户端结果同上:
2)服务端结果如下:
服务端共建立两个实例(与建立的客户端代理类数目一致),分别完成5次和3次函数调用(与客户端代理类调用服务操作的次数一致)。
3.Single的验证
首先设置[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)],然后运行WCFLifeCycle.sln。
1)客户端结果同上:
2)服务端结果如下:
服务在启动时建立了一个实例,以后一直是使用此实例完成8次请求,不管客户端代理的个数和调用次数是多少,始终只有一个实例。