ASPX页面编译
回顾csc编译器
以往的程序编译器是把编写好的程序代码编译生成可以直接为计算机所使用的机器语言。
然而,Visual C#的编译器(CSC.exe)也可以把编写好的程序代码编译成EXE(或者DLL)文件,但这种文件只是一种IL文件(中间语言),此IL文件不能直接被计算机使用。
只有当此IL文件被调用的时,再通过一种名叫JIT(即时编译)编译器把此IL文件生成可以供计算机使用的机器代码。
IL文件生成
csc编译器只是一个c#语言的编译器,它只能对符合c#语言规范的文件进行编译。而aspx文件的格式显然不符合c#语言规范,所以csc编译器是无法对aspx源文件进行编译的。
因此,要想把aspx文件编译成dll文件,必然要先把aspx文件转化成csc编译器能识别的cs源文件。
故aspx页面的程序集(dll)生成一般会分为两个步骤。
第一步:转化成csc编译器能识别的cs源文件
第二步:csc编译器把cs源文件生成页面的程序集,
这样两步建立aspx到dll(中间语言IL文件)的实现。
(PS:实现第一步的工具肯定隐藏在.net framework内。)
页面发生编译
(以下注意预先发布的区别)当一个http请求从客户端发送(http://localhost/TestDLL/IndexWebPage.aspx)到IIS服务器,如下:
IIS捕获并分析这个请求,当它分析到这个请求是一个aspx页面时立即以“/TestDLL/IndexWebPage.aspx”为参数调用asp.net运行环境(aspnet_wp.exe),
asp.net环境启动后,检查“/TestDLL/IndexWebPage.aspx”是否存在。若不存在,则向客户端返回http 404(filenot found)错误;若存在,则在asp.net临时目录中(或者bin)查找相应的dll文件,如下图:
若不存在或者该dll比aspx源文件“旧”,则调用csc编译器(若aspx的服务端脚本语言是vb或jscript,则调用相应的vbc编译器,jsc编译器)把aspx文件编译成dll,即从Page类(或Page派生类)派生出相应的类,该动态生成的类会被编译为程序集(dll)。
该程序集之后会被缓存到ASP.Net专用的临时目录下。
然后asp.net再调用该dll来处理具体的客户请求,返回服务器响应。
页面重新编译
链接aspx源文件没有被更改,且整个应用程序没有重启,则已编译的页面(DLL)就一直存在。
对已链接aspx文件任何更改,将使相关程序集变为无效,当该页面下一次被请求时,强制创建新的程序集。
如果bin文件夹中程序集被改动(新建或替换),页面也会被重新编译。
编辑web.config和global.asax之类的文件会导致整个应用程序重启,页面也会被重新编译。