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不一定完全兼容的。