我的ASP.NET静态变量中每隔X次插入就会将自身刷新到DB。 问题是,如果我发布应用程序,IIS进程将被我的所有静态材料终止。
如何保留它 - 或者在ASP.NET应用程序关闭后如何刷新它?
谢谢
答案 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想要关闭,它不一定会通知您的应用程序。我建议你重新考虑你的写缓冲/缓存场景 - 只保留你可以承受丢失的数据。