我在我的ASP.NET静态变量中,每次X插入都会将自身刷新到DB.问题是,如果我发布应用程序,IIS进程将被我的所有静态材料杀死.
如何保留它 - 或者如何在ASP.NET应用程序关闭后刷新它?
谢谢
Haw*_*xby 14
Global.asax中
void Application_End(object sender, EventArgs e)
{
// SHUTDOWN CODE HERE
}
Run Code Online (Sandbox Code Playgroud)
如前所述,强烈建议不要让应用程序持续存储大数据Application_End,因为这可能会在应用程序池关闭时触发,而不是在关闭开始时触发.这是在更详细的(但仍短)解释这里.
如果仍然希望捕获关闭应用程序池的所有不立即杀死它的情况,可以执行以下操作:
肮脏的方式
1)获取关闭时间限制 - IIS管理器 - >应用程序池 - > - >高级设置... - >过程模型组 - >关闭时间限制(秒)
2)在应用程序中创建一个线程/任务,运行时间是关闭时间限制的两倍,以确保可以捕获"关闭"状态.这个帖子应该
i)检查应用程序池是否正在关闭
public bool IsShuttingDown()
{
return System.Web.Hosting.HostingEnvironment.ShutdownReason != ApplicationShutdownReason.None;
}
Run Code Online (Sandbox Code Playgroud)
ii)如果关闭,请做你的东西.确保只执行一次
更正确的方式(如所示这里)
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
}
}
Run Code Online (Sandbox Code Playgroud)
2)注册你的对象(Global.asax.cs)
protected void Application_Start()
{
// other initialization code here
HostingEnvironment.RegisterObject(new HostingEnvironmentRegisteredObject());
}
Run Code Online (Sandbox Code Playgroud)
3)取消注册(来源)
首先调用Stop方法,并将immediate参数设置为false.该对象可以完成处理,调用UnregisterObject方法,然后返回,也可以在调用UnregisterObject方法之前立即返回并异步完成处理.
如果在应用程序管理器的超时期限到期之前注册的对象未完成处理,则会立即将参数设置为true再次调用Stop方法.当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);
}
Run Code Online (Sandbox Code Playgroud)
注意:这仅在IIS(可能是其他Web服务器)中托管时才有效,但在IISExpress中不会触发IApplicationLifetime功能.
| 归档时间: |
|
| 查看次数: |
6997 次 |
| 最近记录: |