ASP.NET页面揭秘(一)
其实对这方面一直掌握的不够熟练,属于半桶水那种类型—一知半解,所以这次重新这阅读了《asp.net 2.0技术内幕》对这块知识又有了新的认识。
在基于IIS的Web服务器上可以访问的所有资源按文件扩展名进行分组。然后把任何一个输入的请求分配给特定的运行时模块处理。ISAPI(Internet Server Application Programming Interface)扩展在 IIS的上下文中处理Web的资源的模块。它就是一个普通的旧式Win32动态链接库(DLL),提供了大量有预定义名称和原型的API函数,为开发人员提供了更加强大的对于IIS功能的扩展。IIS和 ISAPI扩展作为一种私有的通信协议使用这些DLL项。对一个资源的请求到达时,IIS首先验证资源类型。图像,文本文件,HTML页面和无脚本ASP页面等静态资源,由IIS直接解析。需要服务器端进行加工的资源被转到已注册的模块。例:.aspx文件就会分配给一个名为C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll的ISAPI扩展处理。
资源映射存储在IIS元库中。ASP.NET在安装时对IIS元库进行修改,确保aspnet_isappi.dll能处理某些典型的ASP.NET资源。(.asax,.ascx,ashx,asmx,aspx,axd等等)
IIS5.0进程模型
跟据该模型,当一个http资源请求来的时候,aspnet_isapi.dll 不能处理.aspx文件,而是充当调度程序。它收集所有有关激活的URL和基础资源信息,然后把请求传给另一个进程: 名为aspnet_wp.exe的asp.net工作进程。ISAPI扩展和该工作进程之间的通道通过命名管道进行。工作进程的一个副本始终在运行,并托管所有的活动的web应用程序。每个web应用程序用自己虚拟目录进行标识,并且属于一个不同的应用区域(通常称为AppDomain)。每当客户第一次处理一个虚拟目录时,在ASP.NET工作进程内创建一个新的AppDomain.创建新的AppDomain后,ASP.NET运行库加载所有必须的程序集,并把控制传递给托管的HTTP 管道以实际服务请求。如果客户从一个已经运行的Web应用程序请求一个页,则ASP.NET运行库只把该请求转发到与该虚拟目录关联的现有AppDomain。如果该AppDomain中没有加载处理该页所有的程序集,则动态地创建它,否则在第一次调用时已经创建,则只使用它。
表示请求页
每个引用.aspx资源的进入请求都会被映射到一个派生 Page类,并且通过它提供服务。ASP.NET HTTP运行时环境首先确定用于服务该请求的类的名称。这里有个特殊的命名约定将该页的URL与该类的名称相关联。例 default.aspx对应类ASP.default_aspx。如果AppDomian当前装入的任何程序集中都不存在具有该名称的类,则HTTP运行库就会命令创建该类并编译。该类的源代码通过解析.aspx 资源的源代码而创建的,并临时保存在ASP.NET文件夹中。接着就对该类进行编译,并载入内存以服务请求。
处理请求
上面谈到创建了一个解析.aspx资源的类,那么接着HTTP运行时环境会通过一个接口(IHttpHandler)的方法来激活该类。根类Page实现该接口(两个成员:ProcessRequest方法和Boolean特性).一旦 HTTP运行库获得了表示被请求资源的类的实例,激活ProcessRequest方法就会产生一个进程,并在生成浏览器的最终响应时间结束。执行和触发ProcessRequest调用的步骤和事件统称为页面生存周期。
什么是ASP.NET HTTP运行时环境?
ASP.NET HTTP运行时环境,它主要包括4个对象
(1)HttpRuntime对象 网页请求通过一个处理原始HTTP负荷的对象管道,并在该链末端为浏览器产生一些标记代码。该管道入口点是HttpRuntime类。ASP.NET工作(IIS5.0是aspnet_wp.exe)进程激活该HTTP管道方法是创建HttpRuntime对象实例,然后调用它的ProcessRequest方法。注意:HttpRuntime.ProcessRequest方法与IHttpHandler接口无关。
HttpRuntime对象在创建时初始化许多有助于首先网页请求的内部对象。调用ProcessRequest方法时,HttpRuntime对象首先把网页提供给浏览器。它为请求创建一个新的上下文(HttpContext类的一个实例,封装了有关请求的所有Http特有信息),并初始化一个特殊的writer对象,其中将收集标记代码。HttpRuntime对象使用该上下文信息找到或创建一个能够处理该请求的Web应用程序对象。通过使用URL中包含的虚拟目录信息搜索该应用程序。用来寻找或创建web应用程序对象的是HttpApplicationFactor(是一个内部使用的对象,负责返回一个能够处理该请求的有效对象。)
(2)应用程序工厂
在应用程序的生命周期内,HttpApplicationFactory对象维护一个HttpApplication对象池,以服务于进入的Http请求。在被激活后,该应用程序工厂对请求验证所瞄准的虚拟文件夹是否有一个AppDomain.如果应用程序已经运行,该工厂就从可用的对象池中获取一个HttpApplication,并把它传递给请求。如果现有的对象不可用,则创建一个新的HttpApplication对象。
(3)HttpApplication对象
HttpApplication对象是一个基类,它代表一个正在运行的ASP.NET应用程序。一个正在运行的ASP.NET应用程序由一个动态创建的继承自HttpApplication的类表示。通过解析global.asax文件内容,可以创建动态生成的应用程序类的源代码。
HttpApplication派生类的一个实例负责管理分配给它的请求的整个生命周期。只有完成后才能重用。HttpApplication维护一个HTTP模块对象列表,它可以筛选或修改请求的内容。当请求通过管道时,调用那些已经注册的模块。
HttpApplication对象确定表示被请求的资源的对象类型,这个类型通常是一个ASP.NET页,一个Web服务或者一个用户控件.然后HttpApplication使用合适的处理程序工厂,获得一个表示被请求资源的对象。一个处理程序工厂对象是一个实现了IHttpHandlerFacory接口类,负责返回一个能够处理该Http请求的托管类的实例——一个HTTP处理程序。ASP.NET页面是一个处理程序对象,一个实现了IHttpHandler接口的类的实例。
(4)页面工厂
HttpApplication 类确定必须处理请求的对象的类型并委派该类型特定的处理程序工厂创建该类型一个实例。当被请求的资源是网页时,那么该工厂就是PageHandlerFactory的类。为了找到合适的处理程序,HttpApplication使用配置文件的<httpHandlers>节中的信息。处理程序工厂对象并创建一个对象的实例,表示被请求的特定页。该对象继承System.Web.UI.Page类,Page类实现了IHttpHandler接口。该页对象返回应用程序工厂,而程序工厂又把它传回到HttpRuntime对象。ASP.NET运行库完成最后调用是IHttpHandler的ProcessRequest方法。这个调用使网页执行该页的代码,并生成浏览器的标记。
小结一下,ASP.NET工作进程服务一个输入的Http请求,首先请求被分配给aspnet_isapi.dll ISAPI扩展,而该扩展又把它传递给HTTP运行时管道。ASP.NET管道入口点是HttpRuntime类。为每个请求创建该类的一个新实例,控制它的总体执行情况,并生成浏览器响应的文本。实例化时,HttpRuntime类执行实例化任务,其中的首要任务是创建一个包装器对象,以封装有关该请求的所有Http特有信息。然后将新建的对象(HttpContext对象的一个实例)传递给该管道,并被各个模块来访问内在的工作对象。