我想我聽說ASP.NET應用程序會在閒置一段時間後關閉(即沒有訪問者)。您可以阻止ASP.NET應用程序關閉嗎?
有沒有辦法阻止這種行爲發生?我有一個計時器,它運行global.asax.cs application_start事件中的一些代碼,並且要確保它繼續運行,即使沒有訪問者訪問該網站。
在此先感謝!
我想我聽說ASP.NET應用程序會在閒置一段時間後關閉(即沒有訪問者)。您可以阻止ASP.NET應用程序關閉嗎?
有沒有辦法阻止這種行爲發生?我有一個計時器,它運行global.asax.cs application_start事件中的一些代碼,並且要確保它繼續運行,即使沒有訪問者訪問該網站。
在此先感謝!
你可以通過幾種方法來實現。
如果您處於選項二下,我強烈建議使用外部源,因爲管理較少,並且如果您沒有可用於配置的IIS,則很可能沒有可用的服務器添加一個ping應用程序。
另外,我不建議的東西,在過程與Web應用程序坐鎮,因爲我已經發現,那些可能會引發問題,當應用程序確實需要回收...
最後一個思想
如果你確實去修改IIS空閒超時的路線,我建議設置應用程序池的定期回收。由於許多Web應用程序確實從週期性回收中受益,並且最常見的空閒超時是最大的正常回收因素。
+1爲外部保持活力,另一個+1(如果我可以)推薦將計時器代碼移入服務。 – 2009-08-20 14:04:13
+1外部keeep活得很好。你甚至可以編寫自己的服務來運行服務器以保持網站的活力。 – Audioillity 2009-08-20 14:11:05
將「空閒超時」設置爲零以完全禁用循環。另請參閱此處:https://stackoverflow.com/questions/1596267/how-to-disable-the-application-pool-idle-time-out-in-iis7 – 2016-09-14 09:25:40
在IIS 6中,轉至「應用程序池」部分,然後右鍵單擊託管相關ASP.NET應用程序的池上的「屬性」。轉到「性能」選項卡,並取消選中「空閒後關閉工作進程:」
在IIS 7中,轉至「連接」窗格並找到「應用程序池」,然後爲承載應用程序的池選擇「高級設置」。找到「空閒超時」屬性並將其設置爲「0」(禁用它)。
缺省值爲20分鐘不活動。通過取消選中該框,一旦你的AppDomain被工作進程加載,它就永遠不會死亡(除非你殺死了進程或當然)。默認情況下,IIS會在進程達到某個限制(例如內存限制)時回收進程,但它也會啓動一個新進程並「分階段」處理所有進入的請求,直到舊進程未使用爲止,以便最大限度地減少中斷。
如果你沒有直接控制你的IIS配置(例如共享主機),最好的方法是在獨立的系統上運行一個小應用程序 - 比如說一個永遠在線的工作站 - 每隔一個系統就會觸發你的網站x分鐘以防止應用程序池超時。沒有什麼奇特的 - 控制檯應用程序中的一個簡單的WebRequest和一個while()循環就可以做到。
轉到您的任務管理器並殺死w3wp.exe(或aspnet_wp)。沒有什麼可以阻止你這樣做。底線,ASP.NET應用程序不能承擔連續的功能。
但是,您可以啓動一個單獨的線程,該線程不會受到空閒超時的限制 - 只要它有要做的事情。我使用這種技術來控制45分鐘的導入,無論是否有人在網站上都會繼續導入。我使用了一個事務日誌和Application_Start,這樣當這個過程被回收時,它會從中斷的地方繼續。
除了外部永葆可以使內部永葆內global.asax
:
static Thread keepAliveThread = new Thread(KeepAlive);
protected void Application_Start()
{
keepAliveThread.Start();
}
protected void Application_End()
{
keepAliveThread.Abort();
}
static void KeepAlive()
{
while (true)
{
WebRequest req = WebRequest.Create("http://www.mywebsite.com/DummyPage.aspx");
req.GetResponse();
try
{
Thread.Sleep(60000);
}
catch (ThreadAbortException)
{
break;
}
}
}
理論上巧妙!但有人試過嗎?它工作嗎?此外,如果您在外部執行此操作,並且在app_start後每隔21分鐘執行一次此操作,則會回收並重新啓動。將最後一次啓動時間和關閉時間寫入數據庫,然後在完成每次回收後可以使用Windows服務重新啓動它。 – 2016-09-14 09:45:30
我在發佈前測試過 – Eduardo 2016-10-04 14:40:51
根據所運行的代碼,我會作出這樣的服務器上運行的Windows服務。 – Martin 2009-08-20 13:59:55
理想情況是,這段代碼應該在服務中。然而,爲了靈活性和可移植性,我們決定讓代碼從global.asax.cs運行。 – 2009-08-20 14:03:21