2008-11-15 97 views
3

我一直玩弄某種自動清理頁面的想法,執行例程維護任務,並通過調用1x1像素gif調用超出當前頁面執行範圍以asp.net頁面作爲src參數。然而,我從來沒有真正決定的一件事是如何處理這樣一個頁面的執行時間,以便它不會執行每個請求,可能就像..每第五個請求。或每30分鐘或其他一段時間。ASP.NET自動執行頁面

您會如何考慮建立這樣的機制?

+0

清理和維護任務的種類是否是ASP.NET特有的?您是否受限於如何安排這些任務,這導致您考慮使用受瀏覽器請求觸發的技術?相應的代碼是否可以自行清理? – 2008-11-15 01:11:43

+0

我在談論的代碼清理的類型是在會話期間存儲文件或數據並放棄會話的時候。我運行一個爲多個應用程序提供服務的Web服務器場,並且在此環境中session_end事件不可靠。 – Chris 2008-11-16 03:27:41

回答

4

我遇到過這種情況很多次了,我通常只是最終使用任務調度器來調用頁面,這樣它就是一致可靠的。依靠一個頁面被調用的問題是,你必須確保總是有對你的頁面的請求。如果可以保證這一點,那麼只需在應用程序級別將上次任務運行時間戳記存儲在變量中,並讓每個頁面都檢查該時間戳記並在請求進入時通過一定的閾值進行更新。

+0

這絕對是最可靠和最簡單的選擇。 – 2008-11-15 03:04:33

+0

這是我使用的最新解決方案 - 在頁面上運行wget的簡單Windows計劃任務。很高興知道這對其他人也有意義。 – Chris 2008-11-16 02:59:19

0

我會設置一個計時器並在定時器啓動時運行清理任務。如果您希望根據請求數量進行清理,可以縮短定時器間隔,然後在定時器觸發時檢查請求計數;如果請求計數太低,則跳過清理。

4

這聽起來像你可能想使用global.asax文件,而不是 - 假設你想每隔N次發生一些事情。例如,如果你想要做的東西每5對站點訪問者,你可以做線沿線的東西,

void Application_Start(object sender, EventArgs e) 
{ 
    // Code that runs on application startup 
    Application["Sessions"] = 0; 
} 

void Session_Start(object sender, EventArgs e) 
{ 
    // Code that runs when a new session is started 
    Application.Lock(); 
    Application["Sessions"] = (int)Application["Sessions"] + 1; 

    if ((int)Application["Sessions"] % 5 == 0) 
    { 
    DoSomething(); 
    Application["Sessions"] = 0; 
    } 
    Application.UnLock(); 
} 

我會大力推薦沿着這些路線的東西,而不是安裝腳本源一個GIF文件。你有更多的控制和安全。

+0

您也可以在Application_Start中啓動後臺線程,該線程可以進行睡眠並執行所需的任務。但是,如果沒有人訪問,它最終會在應用程序池死亡時停止。唯一的解決方法是有計劃的任務。 – 2008-11-15 03:02:48

1

您是否考慮過使用Windows服務?運行清理任務將佔用ASP.NET線程池中的線程。或者,如果您正在清理SQL Server數據庫,則SQL Server代理作業可能會更好。

1

從stackoverflow博客相關條目:http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

其他:

注意如果你缺乏穩定,一致的流量數解決方案不起作用。如果IIS卸載您的應用程序,緩存,會話和請求方法不起作用。

如果可能,請爲每項服務安裝Windows任務服務。制定一個方案來動態添加/刪除任務。

如果您的應用程序已託管並且您無法安裝服務,請考慮使用站點監視器進行操作 - 例如siteuptime。這將您的應用程序保存在內存中,允許您將處理程序或操作頁面與虛擬圖像進行匹配,並讓您決定它的運行時間。