[英]How to listen to IIS shutdown event in ASP.NET
我在我的ASP.NET靜態變量中,每次X插入都會將自身刷新到DB。 問題是,如果我發布應用程序,IIS進程將被我的所有靜態材料殺死。
如何保留它 - 或者如何在ASP.NET應用程序關閉后刷新它?
謝謝
Global.asax中
void Application_End(object sender, EventArgs e)
{
// SHUTDOWN CODE HERE
}
如前所述,強烈建議不要讓應用程序在Application_End
期間保留大數據,因為這可能在應用程序池關閉時觸發,而不是在關閉開始時觸發。 這是在更詳細的(但仍短)解釋這里 。
如果仍然希望捕獲關閉應用程序池的所有不立即殺死它的情況,可以執行以下操作:
骯臟的方式
1)獲取關閉時間限制 - IIS管理器 - >應用程序池 - > - >高級設置... - >過程模型組 - >關閉時間限制(秒)
2)在應用程序中創建一個線程/任務,運行時間是關閉時間限制的兩倍,以確保可以捕獲“關閉”狀態。 這個帖子應該
i)檢查應用程序池是否正在關閉
public bool IsShuttingDown()
{
return System.Web.Hosting.HostingEnvironment.ShutdownReason != ApplicationShutdownReason.None;
}
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
}
}
2)注冊你的對象( Global.asax.cs
)
protected void Application_Start()
{
// other initialization code here
HostingEnvironment.RegisterObject(new HostingEnvironmentRegisteredObject());
}
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);
}
注意:這僅在IIS(可能是其他Web服務器)中托管時才有效,但在IISExpress中不會觸發IApplicationLifetime
功能。
依賴應用程序關閉事件來保持數據庫更新是有風險的。 如果IIS重新啟動,重新啟動或停電,那么您將錯過該事件。
您可能不會收到IIS正在關閉的任何通知。 想想如果IIS AppPool崩潰將會發生什么,或者如果服務器失去電源將會發生什么。
你不能依賴聽到關機事件。 如果IIS想要關閉,它不一定會通知您的應用程序。 我建議你重新思考你的寫緩沖/緩存場景 - 只保留你可以承受的丟失數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.