Visual C#.NET Web应用程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 ASP.NET的执行过程

3.2节介绍了Web窗体的概念,描述了其创建步骤和方法,分析了代码内联和后台编码两种模式,那么,当用户请求Default.aspx页面时,IIS是如何将Default.aspx与Default.aspx.cs进行组合编译生成HTML代码响应用户的请求呢?此问题也就是ASP.NET页面的执行过程,理解掌握ASP.NET的执行过程,对Web应用程序深入编程具有十分重要的意义。

ASP.NET页面的执行过程是一个较复杂的过程,涉及IIS、CLR、Framework等,下面是简化描述的ASP.NET的执行过程示意图,如图3.10所示。

(1)IIS将请求转交给aspnet_isapi.dll。在用户于浏览器上输入网址(http://localhost:8088/student/test.aspx)连接至IIS后,IIS会根据访问者请求的IP、端口、虚拟目录和文件名查找对应站点,找到站点后依据所要求的文件扩展名来启动对应的IIS Extension程序处理此要求,aspx这个文件扩展名与aspnet_isapi.dll对应,控制权交给aspnet_isapi.dll。

(2)aspnet_isapi.dll转交给ASP.NET Worker Process。aspnet_isapi.dll只是一个入口,真正处理工作的是其转交的ASP.NET Worker Process(简称ASP.NET WP工作进程),WP首先解析访问者请求中的虚拟目录信息,决定创建或使用先前已建好的AppDomain对象来处理此请求(理论上每一个虚拟目录都对应着一个AppDomain对象,如果没有虚拟目录对应的AppDomain对象,则创建它并将Assemblys及访问者所要求的.aspx文件加载)。

(3)WP将请求转交给ISAPIRuntime对象。WP将要求转送至虚拟目录对应的Application Domain中的ISAPIRuntime对象,此对象的主要功能是由ISAPI封包中解出信息后转交给HttpRuntime对象。

(4)ISAPIRuntime对象将请求转交给HttpRuntime对象。在解出必要的信息后,ISAPIRuntime对象调用HttpRuntime.ProcessRequest函数处理用户请求。

(5)HttpRuntime对象将请求转交给HttpApplication对象。HttpRuntime.ProcessRequest函数创建HttpContext、Cache、HttpWriter、HttpApplication对象,并将访问者信息填写到HttpContext对象中。在创建HttpContext对象后,HttpRuntime对象向HttpApplicationFactory对象要求一个HttpApplication对象,在取得HttpApplication对象实例的同时,相关的HttpModules模块会被加载,HttpModules指的是Application层级的模块,如HttpSession、Authentication等模块。

图3.10 ASP.NET的执行过程示意图

(6)HttpApplication对象将请求转交给HttpHandler对象。HttpApplication对象创建好之后,紧接着调用HttpApplication的ProcessRequest函数,此函数会创建一个对应的HttpHandler对象并将请求中的URL信息传入,然后将执行权转交至该对象上。创建哪一种HttpHandler对象是由虚拟目录中的web.config文件或是.NET Framework目录中的machine.config文件内的HttpHandler对应表所指定的,.aspx文件指定由System.Web.UI.PageHandlerFactory类创建HttpHandler对象。

(7)HttpHandler对象转交给Page对象。在取得HttpHandler对象后,HttpApplication对象会将HttpContext对象转交给HttpHandler.ProcessRequest函数或者BeginProcessRequest函数,被调用的函数调用PageHandlerFactory对象创建GhostPage对象(Page对象),Page对象处理请求并将取得的网页内容返回给IIS。GC负责处理HttpHandler对象的回收。

(8)Page对象的创建过程。PageHandlerFactory创建Page对象的过程可以简单地描述为,当PageHandlerFactory对象接收到HttpApplication对象要求一个.aspx文件所对应的HttpHandler对象时,PageHandlerFactory对象会创建一个PageParser对象,此对象利用由PageHandlerFactory对象所传入的虚拟目录参数找到对应的.aspx文件(如test.aspx文件),读入此文件后执行解译动作来创建ControlBuilder对象群,接着再将这些对象群交给PageCompiler对象来创建与编译源代码,原来的ASP.NET Tag经由PageParser对象转化为一个ControlBuilder对象,PageCompiler对象则利用ControlBuilder对象中的信息来创建出Page对象及其函数。

Page对象初始化阶段会调用所有子控件的OnInit函数,该函数通过调用LoadPage ViewState函数从_VIEWSTATE中得到Page对象(页面)及子控件的先前状态,然后调用OnLoad函数初始化控件,以及SaveViewState函数存入_VIEWSTATE中,再调用Process PostData函数处理Post-Back所返回的数据。Ghost Page Class是继承自用户所定义的WebForm类,最后执行Ghost Page Instance取得最终的HTML程序代码。关于Page对象的创建与初始化过程将在3.4节中进行更详细的叙述。

注意:一个虚拟目录对应一个AppDomain对象和HttpRuntime对象,一个访问者对应一个HttpApplication对象、HttpContext对象、HttpSession对象和Page对象,HttpContext对象负责管理HttpSession对象。