ASP.NET Pre-Compilation and Keep-Alive
2024-07-10 12:57:38
供稿:網友
asp.net pre-compilation and keep-alive
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了。
這個方法是從aspaliance上看來的,具體出處已經找不到了。
3、delphi8
d8的文章在csdn上也漸漸多了起來。如果不討厭pascal的語法,那么d8安裝目錄的source目錄下的文件實在是一個不錯的學習.net的資源,里面有d8的rtl、vcl.net、indy.net、web數據感知控件實現的源碼,至少可以看看d8是如何將它的東西和.net的東西結合起來的。
比如,在borland.delphi.system.pas里面,我看到了tobject = system.object,呵呵,和我們想象的一樣。在borland.vcl.classes.pas里面,我看到了tlist有一個private成員flist是system.collections.arraylist類型的,于是顯然tlist是通過聚合arraylist來實現的。而在borland.vcl.forms.pas里面,可以看到tform是從tcustomform繼承下來,然后上面依次是tscrollingwincontrol、twincontrol、tcontrol...和system.windows.forms.form沒什么關系,這也就是d8要分vcl.net app和win app的原因,vcl.net很多控件仍然是borland按自己的方式寫的(雖然都是managed code寫的),他們和winforms不一定完全兼容的。