2011-05-17

一种让WCF服务实例长期存在的方法

Posted in .NET at 15:14 Author:仲远

标签:

在有些情况下,我们会希望能够提供一种WCF的服务,由我们的服务器提供数据存储服务,然后提供一些API供别人调用。在.NET框架下,使用WCF是一种非常方便的选择。不过默认情况下,(1)WCF服务对于每个Client端都会实例化一个WCF服务对象,这样如果数据初始化过程比较慢的话,就会导致这个服务不太可用;(2)如果使用IIS来作为WCF宿主的话,默认情况下,IIS会有一个对象实例的有效期,并且会定时清理垃圾,这样就会导致WCF中的静态对象被清理掉(如果有一段时间没有Client进行调用此WCF服务的话)。

本文将介绍一种以IIS为宿主,并且让一个WCF服务实例长期存在的办法。以下为设置步骤:

(1)在service的具体实现类中,添加InstanceContextMode = InstanceContextMode.Single的设置,如:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Service1 : IService1
{

}

(2)在IIS Manager中,单击左边IIS Server Name(机器名)下的”Application Pools”,再点击右边Actions->Set Application Pool Defaults,会弹出一个对话框,改为如下设置:
a) ProcessModel -> Idle Time-out(minutes): 0 (原来为20分钟)
b) Recycling -> Regular Time Interval(minutes): 0 (原来为1740分钟)
IIS Setting

进行以上设置后,重新发布这个WCF Service,再重启一下IIS即可。不过这样设置也可能存在一些风险性,首先针对IIS的设置是全局的,如果你的这台机器上还提供别的WCF服务,则那些服务就会受到影响。另外,将IIS设置成不自动进行内存回收,可能在某些情况下会导致内存溢出等错误。

不过我们的WCF服务在以上设置情况下运行数周,状态良好。

本文可以自由转载,转载时请保留全文并注明出处:
转载自仲子说 [ http://www.wangzhongyuan.com/ ]
原文链接:

Leave a Comment

*
To prove you're a person (not a spam script), type the security text shown in the picture. Click here to regenerate some new text.
Click to hear an audio file of the anti-spam word