如何保持 AppDomain 中的 ASP.NET 程序集處於活動狀態?
**場景:**我有一個使用 Web 部署項目部署的 n 層企業 ASP.NET 應用程序。所有層都生成由 ASP.NET 應用程序使用的獨立程序集。
**問題:**當我執行應用程序時。部署後第一次需要花費大量時間將依賴程序集載入到記憶體中。但是一旦載入了它的快速照明應用程序。如果沒有使用者訪問該應用程序,IIS 會從記憶體中解除安裝程序集,當使用者嘗試在以後的實例上訪問該應用程序時,它會再次載入所有程序集,載入時間與載入時間相同第一次這樣做。
我正在尋找一種解決方案,使我能夠將我的程序集持久地載入到記憶體中,從而覆蓋程序集對記憶體駐留的易失性。
或任何其他讓我的使用者愉快地使用解決上述問題的應用程序的解決方案。
在IIS 6中,轉到 Application Pools 部分,然後在託管相關 ASP.NET 應用程序的池上右鍵點擊 > Properties。轉到性能選項卡並取消選中“空閒後關閉工作程序:”
在IIS 7中,轉到“連接”窗格並找到“應用程序池”,然後為託管應用程序的池選擇“高級設置”。找到“空閒超時”屬性並將其設置為“0”(這將禁用它)。
預設值為 20 分鐘不活動。通過取消選中該框,一旦您的AppDomain被工作程序載入,它將永遠不會死亡(除非您殺死程序或其他東西)。預設情況下,IIS 會在程序達到某個限制(例如記憶體上限)時回收該程序,但它也會啟動一個新程序並“逐步處理”所有傳入請求,直到舊請求未被使用,以最大程度地減少中斷。
我還編寫了一個小的 c# 類,它可以讓您的 ASP.NET 應用程序在正常情況下保持活躍(備用存檔版本)。由於它在應用程序中執行,顯然它不能阻止 IIS 或其他任何東西顯式殺死程序,但它會保持應用程序“熱”,例如應用程序永遠不會空閒足夠長的時間讓 IIS 決定關閉它.
如果您無法直接控制您的 IIS 配置(例如共享主機),那麼最好的辦法是在單獨的系統上執行一個小型應用程序 - 例如,一個永遠線上的工作站 - 每 x 分鐘訪問您的站點以保持應用程序池超時。沒什麼特別的——一個簡單的WebRequest和一個控制台應用程序中的 while() 循環就可以了。