第3章ASP.
NET页面剖析
在Web应用
程序上下文中,ASP.NET页面会在第一次被请求时,按需被动态编译.动态编译并不是ASP.NET页面(.aspx文件)特有的,还发生在.NETWeb服务(.asmx文件),用户控件(.ascx文件),WebHTTP处理程序(.ashx文件),以及其他几种ASP.NET应用程序文件(如global.asax文件)身上.运行时管道模型负责处理输入的(incoming)HTTP数据包,使其从一个简单的特定协议有效负载转化为服务器端ASP.NET对象——准确地说,是一个
系统Page类的派生类的实例.ASP.NET中的HTTP运行库会处理页面对象,将生成的标记插入响应序列中.处理用户代码的若干事件标志着响应序列的生成各个阶段,整个过程称为"页面的生命周期"(pagelifecycle).本章会介绍如何将.aspx页面的HTTP请求映射为页面对象,Page类的编程接口,以及如何通过页面生命周期中的事件处理控制标记的生成.
3.1页面的调用
先让我们具体认识一下.aspx页面是如何被转化为类并编译为程序集的.特定.aspx资源的程序集的生成,分为两个步骤进行.首先,该资源文件的
源代码会被解析,根据得到的信息,从Page类(或Page的派生类)派生出相应的类.然后,动态生成的类会被编译为程序集,该程序集之后会被缓存到ASP.NET专用的临时目录下.
只要链接的(linked).aspx源文件没有被更改,且整个应用程序没有重启,已编译的页面就一直存在.对已链接的.aspx文件的任何更改,将使相关程序集变为无效,并在该页面下一次被请求时,强制HTTP运行库创建新的程序集.【89】
提示:编辑
web.config和global.asax之类的文件会导致整个应用程序重启.在这种情况下,在某个页面被请求时,所有页面会被重新编译.如果Bin文件夹中的程序集被改动(新建或被替换),所有页面也会被重新编译.
3.1.1运行机制
能够通过基于Internet信息服务(IIS)的Web服务器访问的所有资源,会按扩展名进行组织.任何来访的请求会被分配给特定的运行时进程模块进行实际的处理.IIS上下文中能够处理Web资源的模块是Internet服务器应用程序编程接口(ISAPI)扩展——实际是普通的传统Win32动态链接库(DLL),很像接口,通过预定义的名称和原型,向外暴露了许多API函数.IIS和ISAPI扩展会针对专用的
通信协议使用这些DLL入口方法.当IIS需要ISAPI扩展完成某项任务时,它会在是加载相应的DLL,并通过有效参数调用适当的函数.虽然ISAPI
文档没有指出ISAPI为接口,但它的确是实现了一组公共编程接口的模块.
1
当某个资源的请求到达时,IIS首先会判断所请求的资源类型.静态资源(如图像,文本文件,
HTML页面和非脚本ASP页面)直接由IIS处理,而不调用任何外部模块.IIS在本地Web服务器上访问被请求的文件,并将其内容写入输出控制台,这样,发出请求的浏览器便能够接收到它了.需要在服务器端处理的请求会被传到已
注册的模块中.例如,ASP页面会由名为asp.dll的ISAPI扩展处理.一般而言,当资源与可执行代码关联时,IIS会将请求交给可执行代码做进一步处理.带.aspx扩展名的ISAPI扩展会被分配给aspnet_isapi.dll(如图3.1所示).
图3.1带.aspx扩展名的资源的IIS应用程序映射
【90】
资源映射信息存储在IIS元库(一种IIS专用的配置数据库)中.ASP.NET在安装时对IIS元库进行修改,使aspnet_isapi.dll能够处理某些典型的ASP.NET资源.表3.1列出了其中的一些.
表3.1aspnet_isapi.dll的IIS应用程序映射
扩展名.asax.ascx.ashx.asmx.aspx.axd[webresource.axd]等)资源类型ASP.NET应用程序文件(如global.asax).这种映射能够确保global.asax不被直接通过请求而获得ASP.NET用户控件文件HTTP处理程序,能够与IIS低级请求/响应服务进行交互的托管模块实现.NETWeb服务的文件ASP.NET页面文件标识内部HTTP处理程序的扩展名,用于实现某些系统功能(如应用程序级的跟踪[trace.axd]或脚本注入
此外,aspnet_isapi.dll扩展还能够处理其他MicrosoftVisualStudio典型扩展名(如.cs,.csproj,.vb,.vbproj,.config和.resx).