如何检测WCF服务的应用程序池重启?

时间:2017-01-30 07:02:19

标签: wcf

在我的WCF服务中,我使用静态字典来保存一些资源密集型数据。我需要在应用程序池被回收时清理资源。是否有任何方法(例如事件)可以检测到应用程序池正在被回收?

2 个答案:

答案 0 :(得分:0)

如果您的应用程序池被回收,则将重置所有静态对象。您可以在创建静态字典的实例时清除所有外部资源(如文件或...)。像这样的东西:

public static partial class ProjectValues
{
    public static ConcurrentDictionary<string, string> MessageDictionary { private set; get; }


    static ProjectValues()
    {
        try
        {
            MessageDictionary = new ConcurrentDictionary<string, string>();
            //then clear the resource here
        }
        catch (Exception ex)
        {
            return;
        }
    }
}

答案 1 :(得分:0)

  

是否有任何方法(例如事件)可以检测到它   应用程序池正在回收?

有点儿。

根据Phill Haack,IIS公开了一个名为HostingEnvironment.RegisterObject的静态方法,它允许您将IRegisteredObject的实现传递给它。

理论上,这会告诉IIS在决定杀死正在运行的应用程序的w3wp.exe进程之前调用IRegisteredObject.Stop操作。

我在理论上说,因为这种方法不是故障安全的,并且有些情况下,AppDomain可以在没有调用,甚至调用但随后在您完成清理之前关闭的情况下消失。