開發 ASP.NET 應用程式的人多少都碰過這樣的困擾:使用者經常抱怨,每天早上一進辦公室,登入我們的網站時都好慢好慢,要等好久才出現第一個頁面。
回答總是千篇一律:第一個存取網站的人,因為有一些初始化的動作,所以會等比較久。(使用者內心對話:原來最早開始工作的人反而會被懲罰 >_<)
曾考慮寫個排程,每天早上對網站發出 request,讓 Web 應用程式的初始化動作事先完成。但這種方法只能算解了一半,畢竟還有很多種情況會導致 IIS 或 application pool 重新啟動。
現在有更好的選擇:IIS 7.5 Application Warm-Up Module
此模組目前還是 beta 版,我裝完之後試了一下,覺得挺好用,設定也很簡單。
底下是一個小實驗,用來測試這個 Warm-Up module。
先試試看未啟用 warm-up 機制的情形:
結果顯示,從前端頁面發出 request 開始,到 Default.aspx 頁面處理完畢,中間大概花了六秒的時間。若再按一次頁面上的按鈕,由於是第二次存取,速度會快很多(不到一秒)。
接著啟用 warm-up:
唯一的問題是......IIS 7.5 only。
回答總是千篇一律:第一個存取網站的人,因為有一些初始化的動作,所以會等比較久。(使用者內心對話:原來最早開始工作的人反而會被懲罰 >_<)
曾考慮寫個排程,每天早上對網站發出 request,讓 Web 應用程式的初始化動作事先完成。但這種方法只能算解了一半,畢竟還有很多種情況會導致 IIS 或 application pool 重新啟動。
現在有更好的選擇:IIS 7.5 Application Warm-Up Module
此模組目前還是 beta 版,我裝完之後試了一下,覺得挺好用,設定也很簡單。
底下是一個小實驗,用來測試這個 Warm-Up module。
- 在 IIS 中建立一個應用程式:DemoWeb。編輯此網站應用程式的 Global.asax,在 Application_Start 事件中刻意延遲約五秒鐘,以模擬應用程式初始化的時間:
void Application_Start(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(5000);
}
- 在 Default.aspx 頁面加一個 HTML Button(注意不是 ASP.NET Button),並撰寫按鈕事件:
function Button1_onclick() {
var now = new Date();
window.location = "http://localhost/DemoWeb/Default.aspx?RequestTime=" +
now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds();
}
這是為了記錄前端頁面發出 request 的時間,方便觀察網頁的處理時間。
- 在 Default.aspx 的 Page_Load 事件中輸出時間資訊:
protected void Page_Load(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(Request["RequestTime"]))
{
Response.Write("發出 Request : " + Request["RequestTime"] + "<BR/>");
Response.Write("傳回 Response: " + DateTime.Now.ToString("H:m:s"));
}
}
先試試看未啟用 warm-up 機制的情形:
- 以瀏覽器開啟 http://localhost/DemoWeb/Default.aspx。
- 將 DemoWeb 所屬的的應用程式集區回收。
- 回到瀏覽器的 Default.aspx 頁面,點一下 Button1,結果顯示如下:
結果顯示,從前端頁面發出 request 開始,到 Default.aspx 頁面處理完畢,中間大概花了六秒的時間。若再按一次頁面上的按鈕,由於是第二次存取,速度會快很多(不到一秒)。
接著啟用 warm-up:
- 開啟 IIS 管理員,點選 DemoWeb,會看到中間面板(功能檢視)的 IIS 區塊下有一個「Applciation Warm-Up」圖示:
- 雙擊「Applciation Warm-Up」圖示,再點右方「動作」面板的「Add requests」,在新開啟的對話窗中輸入你希望應用程式「熱身」時所欲觸發的 URL(相對路徑):
- 以瀏覽器開啟 http://localhost/DemoWeb/Default.aspx。
- 將 DemoWeb 所屬的的應用程式集區回收。
- 稍等個五秒左右,讓 IIS 自動幫應用程式完成「熱身」。
- 回到瀏覽器的 Default.aspx 頁面,點一下 Button1,結果如下:
唯一的問題是......IIS 7.5 only。
沒有留言: