大家都知道,要實現一個24*7全天候運行的應用程式並不是一件容易的事。我的一個專案就曾經在暴力負荷下堅持了20多個小時後還是壯烈掛掉了。幸運的是,ASP.NET和IIS為我們提供了一些簡單的設施,讓我們能夠輕鬆建立超級穩定的.Net應用程式。不過稍嫌不爽的是,Windows 2000(IIS6.0 以下版本) 和Windows 2003(IIS6.0)系統下的設定方法不盡相同。
先說說windows 2000系統,熟悉ASP.NET的兄台應當都知道machine.config 這個檔案吧,它保存在%WindowPath%Microsoft.NetFramework%.NetVersion%CONFIG 目錄下。隨便用什麼文字編輯器(當然最土的就屬「記事本」 了)開啟該文件,找到<processModel ...> 這一節。 ASP.NET就是根據這一節的設置,來控制ASP.NET服務進程(aspnet_wp.exe 或w3wp.ext )的。我們的寫好的ASP.NET 應用程式程式碼就運行在這個進程空間內。如果你使用的是Framework 1.1 你會在這一節中看到n多個屬性,我們關心的是下面三個,等號後面是它們的預設值:
timeout="Infinite"
idleTimeout="Infinite"
memoryLimit="60"
在Framework 2.0 下你看不到它們,但你可以手工把它們加進去。
我來翻譯這三個屬性的意思,在持續運行了timeout 指定的時間後,重啟ASP.NET服務進程,timeout 的缺省值為無窮大,你可以按“HH:MM:SS”的格式重新設置,如,timeout=24:00:00表示24小時後重啟; 如果在idleTimeout 指定的時間內沒人的訪問,則重啟ASP.NET服務進程,idleTimeout 的缺省值同樣為無窮大,設置方式如上;如果ASP.NET服務程序所使用的記憶體佔系統總記憶體的百分比超過了memoryLimit 指定的數量,則重新啟動ASP.NET服務程序。
明白了吧,透過這三個屬性的配合,就可以神不知,鬼不覺的重啟服務進程,從而使咱的應用程式生生不息的運作下去。我這樣說,細心的讀者可能已經發現問題了,當服務進程重啟時,客戶端的會話(Session)必然會遺失,用戶的操作也就被中斷了。怎麼能做到「神不知,鬼不覺」呢?
這個問題確實存在,不過可以透過以下措施將其影響減至最小,甚至完全消除:
首先,我們可以把idleTimeout 設為一個合理的值,通常我會將其置為會話(Session)超時設定的1.5- 3倍。將timeout 置為程式能堅持的上限值,我通常會將其置為24小時。這樣將迫使服務程序在空閒時重啟,由於這時不存在任何會話(Session),所以也不可能中斷使用者的操作。這種設置在中小企業辦公環境中非常有效,因為下班後基本上沒有人訪問。
當然,上面的方法限制很大,只能在特定場合運作。如果在持續有人訪問,或者記憶體超限的情況下重啟,用戶的操作仍然會受到干擾。一個終極的解決辦法就是,將會話(Session)狀態保存在獨立的進程中。在ASP.Net上,這也可以透過簡單的配置來實現。
出處:BLOG 錄一室