Dream Tech Blog

A person with no dream in life can never live a happy life.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ASP.NET Pre-Compilation and Keep-Alive

Posted on 2004-02-11 11:53  Dream  阅读(1089)  评论(0编辑  收藏  举报


1、Pre-Compilation in Whidbey

ASP.NET一大特色就是Dynamic Compilation,但是有些場合Pre-Compilation卻是更好的選擇,比如,你不想訪問你的站點的第一個用戶癡癡的等待,或者你根本不想把任何源碼(包括HTML的內容)給你的用戶。

Pre-Compilation在ASP.NET 2.0中支援得很徹底,你可以選擇In-Place Pre-Compilation,只需要你訪問一下:
http://站點名稱/WebApp名稱/PreCompile.axd
系統就會將WebApp裏面所有的頁面先給你編譯一遍。

或者,更加徹底的方式,PreCompilation for Deployment,.Net Framework 2.0提供了一個命令行的工具(aspnet_compiler.exe),讓你將WebApp中所有的代碼、頁面(包括HTML)、靜態檔全部編譯進dll,然後給你一個“Deployment-Ready WebApp”,No Code、No Html,呵呵,但是流覽起來和普通的WebApp沒有區別。

這篇文章包含了更多的資訊。

2、Pre-Compilation and Keep-Alive in .NET Framework 1.1

Whidbey畢竟是明年的事,其實在現在,我們也可以想一些辦法。

Global.asax裏面的那個Global類是繼承自HttpApplication的,我們可以自己插入一個中間層,來做一些自己的事情。比如我們創建一個PreGlobal類,繼承自HttpApplication,在PreGlobar.Init()方法中,創建一個新的線程,讓這個線程遍曆訪問WebApp中所有的.aspx和.ascx(對ascx就LoadControl(),對aspx就HttpWebRequest.Create(url).GetResponse()),這樣可以實現我們自己的“Pre-Compilation”,然後再讓Global繼承自我們自己的這個PreGlobal就可以了。

我們可以感覺到,如果一段時間沒有訪問WebApp,那麼當再次訪問時,速度大大降低,這是因為Clr會自動將站點的Assembly從記憶體中Unload,當再次訪問時,再載入Assembly,而這個動作是相當耗時的(想想在電腦上運行一個WinForm,它的啟動時間)。我們需要想一個辦法讓我們的WebApp始終Keep-Alive,這樣Clr就不會將它Unload了。方法還是PreGlobal.Init()方法,我們在這個方法中創建一個Timer物件,定時時間小於默認的Session過期時間即可,在其Elapsed事件中調用一下“HttpWebRequest.Create(站點url).GetResponse()”就可以讓我們的站點始終Alive了。