簡體   English   中英

如何在ASP.NET中偵聽IIS關閉事件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM