在安装了.NET Framework的机器上会有一个特殊的文件夹,它位于系统分区下,如图1-12所示。
因为笔者的系统分区是C盘,并且IIS使用了.NET Framework 2.0,所以这个文件夹是C:\WINDOWS\ Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files,这个文件夹是用来存放ASP.NET应用程序的临时文件的。我们可以用Dreamweaver创建一个简单的ASP.NET网页Test.aspx页面。
① 打开Dreamweaver,选择'新建',并且依次选择'动态页'→'ASP.NET C#',如图1-13所示。
图1-12 ASP.NET临时文件夹 |
图1-13 使用Dreamweaver创建ASP.NET网页 |
② 单击'创建'按钮,就可以创建一个新的ASP.NET页面,在这个新建的ASP.NET页面中无须输入任何代码,只需将这个文件保存在系统分区下的Inetpub\wwwroot目录中即可(因为笔者的系统分区为C盘,所以是C:\Inetpub\wwwroot,这个目录就是IIS默认网站的根目录),文件名为Test.aspx。然后在浏览器中输入http://localhost/test.aspx,将会看到一个空白页面,这个空白页面不是我们所要关心的结果,我们关心的是在ASP.NET临时文件夹中会有些什么变化。打开C:\WINDOWS\ Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files这个文件夹,我们会发现此时多了一个子文件夹root,如图1-14所示。
(点击查看大图)图1-14 ASP.NET临时文件夹下的情况 |
再继续打开这个文件夹,到最后会发现如图1-15所示的结果。
通过上面的演示可以得出如下结论:对于我们刚刚创建的那个空白的Test.aspx页面,经过客户端浏览器请求之后,会在相应的.NET Framework运行版本下的ASP.NET临时文件夹下生成对应的DLL文件。
利用.NET Framework自带的ILDASM工具打开那个DLL文件,可以看到这个DLL文件的中间代码信息(注:ILDASM.exe文件是随着.NET Framework一同发布的、用于给用户查看.NET代码编译后生成的IL中间代码的工具。例如,安装.NET Framework 2.0之后可以通过'开始'→'所有程序'→'Microsoft .NET Framework SDK v2.0'→'SDK命令提示'运行SDK命令窗口,在窗口中输入ILDASM即可运行这个程序),如图1-16所示。
(点击查看大图)图1-15 root文件夹下的文件 |
图1-16 利用ILDASM查看生成的DLL文件的效果 |
从图1-16中可以看见这个DLL文件中包含有ASP.test_aspx类,并且这个类是继承自System.Web.UI.Page类的。
其实在我们第一次向IIS请求ASP.NET网页时,相应的网页就会被编译成DLL文件,然后JIT来运行这个DLL文件,并将运行结果发送给客户端。一旦这个文件再次编辑这个ASP.NET页面后,下次再请求这个网页时又会重新被编译成DLL文件,再由JIT来运行。为了防止发生生成的文件重名的情况,生成的DLL文件采用了随机命名。
当向服务器发送一个ASP.NET网页的请求时,在内部执行的流程如下:
① 检查在服务器内存中是否存在这个网页对应的本地机器代码。
② 如果存在,则执行本地机器代码,将运行结果发送到客户端。
③ 如果不存在本地机器代码,则检查是否存在这个网页编译后的中间代码(以DLL的形式存在),如果存在,则将中间代码编译成本地机器代码,再执行本地机器代码将结果返回给客户端,并将本地机器代码缓存到内存中。
④ 如果不存在对应的中间代码,则将这个网页编译成中间代码,然后将中间代码编译成本地机器代码,将本地机器代码的执行结果发送给客户端,再将本地机器代码缓存到内存中。
如图1-17所示的是ASP.NET运行时流程图。
(点击查看大图)图1-17 ASP.NET运行时流程图 |
从图1-17中可以看出,如果在服务器没有清理掉内存中缓存的本地机器代码而再次访问同一个页面时,服务器就会直接执行缓存中的本地机器代码,本地机器代码的运行速度是相当快的。即使本地机器代码在内存中由于某些原因被清理掉了(比如服务器重启或者服务器内存不够用时被释放),也仅仅是将中间代码编译成本地机器代码,再次运行本地机器代码将运行结果发送给客户端,然后缓存本地机器代码即可,将中间代码编译成本地机器代码的速度也是很快的。
这也就是ASP.NET网页不同于ASP或者PHP网页的地方:ASP.NET页面在第一次请求时会被编译成DLL文件,再由JIT编译成本地机器代码执行,并且将本地机器代码缓存,如果在缓存没有清空之前再次调用,则会直接执行缓存中的机器代码,即使内存中缓存的机器代码被清空也会再次将中间代码编译成本地机器代码运行并缓存;而ASP和PHP网页每次运行时都会被解释成本地机器代码再运行,所以ASP.NET网站的总体运行速度要比ASP和PHP快。不过,aspx页面第一次被打开时比较慢,因为存在着先生成中间代码再编译成本地机器代码执行的过程;以后执行时就会比较快了。因为以后执行时要么是直接运行本地机器代码,要么是将中间代码编译成本地机器代码再运行,除非修改了代码;否则就没有必要重新生成中间代码了,并且对于第一次运行时比较慢的情况也可以通过预编译来解决。