簡體   English   中英

IIS7.5 和 Asp.Net 3.5+ 如何檢測當前應用程序池是否結束

[英]How to detect if the current application pool is winding up in IIS7.5 and Asp.Net 3.5+

好吧 - 正如問題主題所述 - 關於如何執行此操作的任何想法?

我一直在查看 System.Web.Hosting 中的對象,但沒有什么特別突出的。

原因? 我遇到一兩個通常在回收期間發生的應用程序錯誤(它們大約相隔 25 小時發生,我將我的應用程序池回收時間保留為默認值),所以我想知道它們是否發生在正在關閉的池中的線程,或正在啟動(ed/ing)的線程。

我最近偶然發現了這篇關於 Brain.Save()的文章,它從托管 WCF 的角度討論了這個問題(他是 Steve Maine - Redmond Connected Servies Division 的項目經理)。

當 WCF 服務托管在 Asp.Net 中時,他們需要能夠執行此操作,因為他們需要能夠關閉任何打開的偵聽器,以便新應用程序域中的 WCF 引擎能夠再次打開它們。

正如本文所演示的,答案是實現IRegisteredObject 接口,調用ApplicationManager.CreateObject來創建對象的實例,然后使用HostingEnvironment.RegisterObject注冊它(所有詳細信息都在接口的 MSDN 文檔中)。

當使用false作為參數調用此對象的IRegisteredObject.Stop(bool)實現時,這是通知應用程序域正在關閉並且應該通過調用HostingEnvironment.UnregisterObject

當它以true調用時,這意味着您沒有及時取消注冊,如果您不立即取消注冊,它將為您完成。

當異常發生時,我當然可以使用這種機制來查明 AppDomain 是否被終止。 拋出異常的相關對象的性質意味着如果它不在關閉時,它必須在初始啟動期間。

然而,同樣地,我可能會開始為我的其他一些更復雜的靜態信息研究這種持久性機制!

歷史

這篇文章還解釋了一些歷史和基本原理,說明為什么您想在global.asax中使用IRegisteredObject而不是Application_StartApplication_End方法:

傳統的 ASP.NET 應用程序可以通過在 global.asax 中實現 Application_Start 和 Application_Stop 等方法來掛鈎應用程序生命周期事件(應用程序啟動/關閉)。 但是,global.asax 用於應用程序代碼。 基礎結構部分(WCF 托管系統是其中之一)需要一種掛鈎 AppDomain 生命周期事件的機制,這些事件不涉及將基礎結構代碼轉儲到 global.asax 文件中。 該空間是為您(用戶)保留的,使用一堆托管粘性物質來污染它是不禮貌的,我們需要使整個事情正常進行。 相反,ASP.NET 人員在 Whidbey 發布期間做了一些偉大的工作,開放了托管 API,並使像 WCF 這樣的人很容易出現並以對應用程序代碼不可見的方式掛鈎這些生命周期事件。

您可以檢查System.Web.Hosting.HostingEnvironment.ShutdownReason的值,當應用程序池不在關閉/回收過程中時,它的ShutdownReason將為 None。

添加實際代碼來執行此操作:

public class RecycleWatcher : IRegisteredObject
{
    public static bool IsRecycling { get; private set; }

    public void Register()
    {
        HostingEnvironment.RegisterObject(this);
    }
    public void Stop(bool immediate)
    {
        IsRecycling = true;
    }
}

然后通過運行啟用它

new RecycleWatcher().Register();

之后,只需檢查 IsRecycling 的屬性即可了解您是否正在回收。

if (RecycleWatcher.IsRecycling) DoSomething();

不確定當應用程序池回收時你到底想做什么,但如果你將下面的事件處理程序添加到 Global.asax 那么其中的代碼將在應用程序關閉時運行。

 protected void Application_End(object sender, EventArgs e)
 {
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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