我有一个WCF服务托管在IIS7中。该服务具有包含字符串的静态列表的静态类(日志类型)。它会定期将条目写入文件或数据库。在WCF服务关闭之前执行操作
但是,当IIS决定应用程序的recyle或因任何原因而终止时,静态字段中的条目将丢失。
有没有什么办法可以处理服务关闭类事件并坚持内存中的数据?
感谢
Shreedhar
我有一个WCF服务托管在IIS7中。该服务具有包含字符串的静态列表的静态类(日志类型)。它会定期将条目写入文件或数据库。在WCF服务关闭之前执行操作
但是,当IIS决定应用程序的recyle或因任何原因而终止时,静态字段中的条目将丢失。
有没有什么办法可以处理服务关闭类事件并坚持内存中的数据?
感谢
Shreedhar
我通过IIS来实现多种服务与定制服务主机(我本来这个,所以我可以为全球错误处理实现IErrorHandler)。
您需要两件事 - 实施ServiceHost
和实施ServiceHostFactory
,它将调用您的自定义服务主机。例如(如图所示的代码只是相关部分):
public class MyCustomServiceHost : ServiceHost
{
protected override void OnClosing()
{
// logic to save off your static data
base.OnClosing();
}
}
public class MyCustomServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return new MyCustomServiceHost(serviceType, baseAddresses);
}
}
在您的.svc文件,你有这样的事情:
<%@ ServiceHost Service="MyCompany.MyServiceName" Factory="MyCompany.MyCustomServiceHostFactory" %>
<%@ Assembly Name="MyCustomServiceHost" %>
这是做到这一点的一种方式(这可以追溯到.NET 3.5天);很可能有其他方法来实现这一点,但至少这应该会给你一些方向。
太好了,谢谢蒂姆。我的应用程序仍然在框架的v3.5中,所以这会很好。我会尽快实施和测试这个解决方案。 – 2012-08-06 21:46:20
处理ServiceHost的[CommunicationObject.OnClosing方法](http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.communicationobject.onclosing.aspx)? – Tim 2012-08-02 06:10:29
我该怎么做?我是否从ServiceHost派生?正如我所说的服务托管在IIS7中,并不做自我托管。 – 2012-08-02 15:09:44
您可以在IIS中实现自定义ServiceHost。我现在没有时间,但我可以在今天晚上回家时(我在美国西海岸)给出更充分的答案。 – Tim 2012-08-02 18:52:39