2009-08-20 77 views
14

我想我聽說ASP.NET應用程序會在閒置一段時間後關閉(即沒有訪問者)。您可以阻止ASP.NET應用程序關閉嗎?

有沒有辦法阻止這種行爲發生?我有一個計時器,它運行global.asax.cs application_start事件中的一些代碼,並且要確保它繼續運行,即使沒有訪問者訪問該網站。

在此先感謝!

+1

根據所運行的代碼,我會作出這樣的服務器上運行的Windows服務。 – Martin 2009-08-20 13:59:55

+0

理想情況是,這段代碼應該在服務中。然而,爲了靈活性和可移植性,我們決定讓代碼從global.asax.cs運行。 – 2009-08-20 14:03:21

回答

25

你可以通過幾種方法來實現。

  1. 如果您可以控制IIS,則可以更改應用程序池中的「空閒超時」,默認情況下爲20分鐘。
  2. 如果您無法控制IIS(共享或其他主機),則可以使用外部服務來ping站點。 MyWebKeepAlivePingdom是很好的選擇。

如果您處於選項二下,我強烈建議使用外部源,因爲管理較少,並且如果您沒有可用於配置的IIS,則很可能沒有可用的服務器添加一個ping應用程序。

另外,我不建議的東西,在過程與Web應用程序坐鎮,因爲我已經發現,那些可能會引發問題,當應用程序確實需要回收...

最後一個思想

如果你確實去修改IIS空閒超時的路線,我建議設置應用程序池的定期回收。由於許多Web應用程序確實從週期性回收中受益,並且最常見的空閒超時是最大的正常回收因素。

+0

+1爲外部保持活力,另一個+1(如果我可以)推薦將計時器代碼移入服務。 – 2009-08-20 14:04:13

+1

+1外部keeep活得很好。你甚至可以編寫自己的服務來運行服務器以保持網站的活力。 – Audioillity 2009-08-20 14:11:05

+0

將「空閒超時」設置爲零以完全禁用循環。另請參閱此處:https://stackoverflow.com/questions/1596267/how-to-disable-the-application-pool-idle-time-out-in-iis7 – 2016-09-14 09:25:40

7

在IIS 6中,轉至「應用程序池」部分,然後右鍵單擊託管相關ASP.NET應用程序的池上的「屬性」。轉到「性能」選項卡,並取消選中「空閒後關閉工作進程:」

在IIS 7中,轉至「連接」窗格並找到「應用程序池」,然後爲承載應用程序的池選擇「高級設置」。找到「空閒超時」屬性並將其設置爲「0」(禁用它)。

缺省值爲20分鐘不活動。通過取消選中該框,一旦你的AppDomain被工作進程加載,它就永遠不會死亡(除非你殺死了進程或當然)。默認情況下,IIS會在進程達到某個限制(例如內存限制)時回收進程,但它也會啓動一個新進程並「分階段」處理所有進入的請求,直到舊進程未使用爲止,以便最大限度地減少中斷。

如果你沒有直接控制你的IIS配置(例如共享主機),最好的方法是在獨立的系統上運行一個小應用程序 - 比如說一個永遠在線的工作站 - 每隔一個系統就會觸發你的網站x分鐘以防止應用程序池超時。沒有什麼奇特的 - 控制檯應用程序中的一個簡單的WebRequest和一個while()循環就可以做到。

0

轉到您的任務管理器並殺死w3wp.exe(或aspnet_wp)。沒有什麼可以阻止你這樣做。底線,ASP.NET應用程序不能承擔連續的功能。

但是,您可以啓動一個單獨的線程,該線程不會受到空閒超時的限制 - 只要它有要做的事情。我使用這種技術來控制45分鐘的導入,無論是否有人在網站上都會繼續導入。我使用了一個事務日誌和Application_Start,這樣當這個過程被回收時,它會從中斷的地方繼續。

13

除了外部永葆可以使內部永葆內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; 
      } 
     } 
    } 
+0

理論上巧妙!但有人試過嗎?它工作嗎?此外,如果您在外部執行此操作,並且在app_start後每隔21分鐘執行一次此操作,則會回收並重新啓動。將最後一次啓動時間和關閉時間寫入數據庫,然後在完成每次回收後可以使用Windows服務重新啓動它。 – 2016-09-14 09:45:30

+1

我在發佈前測試過 – Eduardo 2016-10-04 14:40:51

相關問題