如何在ASP.NET中侦听IIS关闭事件

时间:2011-01-18 11:36:06

标签: c# asp.net iis

我的ASP.NET静态变量中每隔X次插入就会将自身刷新到DB。 问题是,如果我发布应用程序,IIS进程将被我的所有静态材料终止。

如何保留它 - 或者在ASP.NET应用程序关闭后如何刷新它?

谢谢

4 个答案:

答案 0 :(得分:13)

Global.asax中

void Application_End(object sender, EventArgs e) 
    {
        //  SHUTDOWN CODE HERE
    }

答案 1 :(得分:7)

如前所述,强烈建议不要让应用程序在Application_End期间保留大数据,因为这可能会在应用程序池关闭时触发,而不是在关闭开始时触发。这更详细地解释了(但仍然很短)here

如果仍然希望关闭所有未立即杀死它的案例的应用程序池,请执行以下操作:

肮脏的方式

1)获取关闭时间限制 - IIS管理器 - >应用程序池 - > - >高级设置... - >过程模型组 - >关机时间限制(秒)

2)在应用程序中创建一个线程/任务,运行时间是关闭时间限制的两倍,以确保"关闭"国家可以被抓住。这个帖子应该

i)检查应用程序池是否正在关闭

public bool IsShuttingDown()
{
    return System.Web.Hosting.HostingEnvironment.ShutdownReason != ApplicationShutdownReason.None;
}

ii)如果关闭,请做你的东西。确保只执行一次

更正确的方式(如here所示)

1)创建一个实现IRegisteredObject

的类
public class HostingEnvironmentRegisteredObject : IRegisteredObject
{
    // this is called both when shutting down starts and when it ends
    public void Stop(bool immediate)
    {
        if (immediate)
            return;

        // shutting down code here
        // there will about Shutting down time limit seconds to do the work
    }
}

2)注册您的对象(Global.asax.cs

protected void Application_Start()
{
    // other initialization code here

    HostingEnvironment.RegisterObject(new HostingEnvironmentRegisteredObject());
}

3)取消注册(source

  

首先使用立即参数设置为调用Stop方法   假。对象可以完成处理,调用   UnregisterObject方法,然后返回或者它可以立即返回   并在调用之前异步完成处理   UnregisterObject方法。

     

如果注册的对象之前没有完成处理   应用程序管理器的超时期限到期,Stop方法是   立即参数设置为true再次调用。当。。。的时候   immediate参数为true,注册对象必须调用   返回前的UnregisterObject方法; 否则,返回它   注册将被应用程序管理员删除。

作为旁注,我还将包含一些有关在ASP.NET Core 2.x中实现相同思想的细节。这可以使用IApplicationLifetime接口执行。示例(Startup.cs):

public void Configure(IApplicationLifetime lifetime)
{
    var quartz = new JobScheduler(Kernel);
    lifetime.ApplicationStarted.Register(quartz.Start);
    lifetime.ApplicationStopping.Register(quartz.Stop);
}

注意:这仅在IIS(可能是其他Web服务器)中托管时才有效,但在IISExpress中不会触发IApplicationLifetime功能。

答案 2 :(得分:6)

依赖应用程序关闭事件来保持数据库更新是有风险的。如果IIS重新启动,重新启动或停电,那么您将错过该事件。

答案 3 :(得分:3)

您可能不会收到IIS正在关闭的任何通知。想想如果IIS AppPool崩溃会发生什么,或者如果服务器失去电源将会发生什么。

你不能依赖听说过关机事件。如果IIS想要关闭,它不一定会通知您的应用程序。我建议你重新考虑你的写缓冲/缓存场景 - 只保留你可以承受丢失的数据。