ASP.NET Web编程原理 之
8.1节介绍了IIS的系统架构和HTTP请求处理的总体流程,从中可以知道每个ASP.NET网站都对应着一个Web应用程序,此Web应用程序可以响应HTTP请求,为用户提供所需的信息。那么,ASP.NET应用程序具体是如何响应HTTP请求的?包括哪些具体的处理流程?这涉及到ASP.NET应用程序的生命周期问题。
8.2.1 ASP.NET应用程序生命周期*
本节以IIS 6为例分步介绍ASP.NET应用程序处理HTTP请求的处理流程。IIS 7的处理过程与IIS 6相比有些小变化,但总体上是一致的。
1 浏览器发出访问某ASP.NET网页的HTTP请求
假设这个请求是针对此网页所属的ASP.NET应用程序的第一次请求。
当此请求到达Web服务器时,由HTTP.SYS负责接收,根据此请求的URL,HTTP.SYS将其传递给此ASP.NET应用程序所对应的应用程序池,由在此应用程序池中运行的工作者进程负责处理请求。
工作者进程接收到这个请求之后,装载专用于处理ASP.NET页面的一个ISAPI扩展“aspnet_isapi.dll”,并将HTTP请求传给它。
工作者进程加载完aspnet_isapi.dll后,由aspnet_isapi.dll负责加载ASP.NET应用程序的运行环境――CLR。
工作者进程工作于非托管环境(指Windows操作系统本身)之中,而.NET中的对象则工作于托管环境(指CLR)之中,aspnet_isapi.dll起到了一个沟通两者的桥梁作用,将收到的HTTP请求(由非托管环境传来)转发给相应.NET对象(处于托管环境中)处理。
2 创建ApplicationManager对象和应用程序域
加载CLR之后,由ApplicationManager类负责创建一个应用程序域。每个ASP.NET应用程序都运行于自己的应用程序域中,由唯一的应用程序标识符标识。
每个应用程序域都对应着一个ApplicationManager类的实例,由它来负责管理运行在域中的ASP.NET应用程序(比如启动和停止一个ASP.NET应用程序,在指定的ASP.NET应用程序中创建对象等等)。
3 创建HostingEnvironment对象
在为ASP.NET应用程序创建应用程序域的同时,会创建一个HostingEnvironment对象,此对象提供了ASP.NET应用程序的一些管理信息(比如ASP.NET应用程序的标识,对应的虚拟目录和物理目录),并提供了一些附加的功能(比如在应用程序域中注册一个对象,模拟特定的用户等等)。
4为每个请求创建 ASP.NET 核心对象
当应用程序域创建完成之后,一个ISAPIRuntime对象被创建,并自动调用它的ProcessRequest()方法。在此方法中,ISAPIRuntime对象根据传入的HTTP请求创建一个HttpWorkerRequest对象,此对象以面向对象的方式包装了HTTP请求的各种信息(这就是说,原始的HTTP请求信息被封装为HttpWorkerRequest对象)。然后,调用ISAPIRuntime对象的StartProcessing()方法启动整个HTTP请求处理过程(此即“HTTP管线:HTTP Pipeline”),在这个处理过程的开端,一个HttpRuntime类型的对象被创建,前面创建好的HttpWorkerRequest对象作为方法参数被传送给此HttpRuntime对象的ProcessRequest()方法。
在HttpRuntime类的ProcessRequest()方法中完成了一些非常重要的工作,其中与Web软件工程师关系最紧密的是:
HttpRuntime类的ProcessRequest()方法根据HttpWorkerRequest对象中所提供的HTTP请求信息,创建了一个HttpContext对象。
HttpContext对象之所以重要,是因为此对象包容了另两个在ASP.NET编程中非常常见的对象:HttpResponse和HttpRequest。
HttpRequest对象中的信息来自于原始的HTTP请求,比如它的Url属性就代表了原始HTTP请求信息中的URL。
而HttpResponse对象则拥有一些属性和方法,用于生成要返回给浏览器的信息。
Page类提供了相应的属性来引用这两个对象,因此在ASP.NET网页中可以直接使用“Requset”和“Response”属性来访问这两个对象。例如:
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Request.Url);
}
}
Page类的Context属性引用HttpContext对象,因此,上述代码也可以改写为以下形式:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.Context.Response.Write(this.Context.Request.Url);
}
}
关于HttpContext、HttpResponse和HttpRequest这三个对象,必须掌握以下的要点:
l HttpContext对象包容HttpResponse和HttpRequest这两个对象,可以从HttpRequest对象获取HTTP请求的相关信息,而要向浏览器输出的内容可以通过调用HttpResponse的方法实现。
l 针对每个HTTP请求,ASP.NET都会创建一个HttpContext对象,在整个HTTP处理过程中,此对象都是可以访问的。
5 分配一个HttpApplication 对象用于处理请求
HttpRuntime类的ProcessRequest()方法除了创建HttpContext对象之外,还完成了另一个很重要的工作——向HttpApplicationFactory类的一个实例申请分配一个HttpApplication 对象用于管理整个HTTP请求处理管线中的各种事件。
HttpApplicationFactory对象负责管理一个HttpApplication对象池,当有HTTP请求到来时,如果池中还有可用的 HttpApplication对象,就直接分配此对象用于处理HTTP请求,否则,创建一个新的HttpApplication对象。
6 HttpApplication对象启动HTTP管线
HttpApplication对象负责装配出整个“HTTP请求处理管线(HTTP Pipeline)”,可以将“HTTP请求处理管线”与现代工厂中的“生产流水线”做个类比。前面步骤中创建好的HttpContext对象就是这个生产流水线要加工的“产品”,当它流经“生产流水线”的不同部分时,将被进行特定的加工和处理过程。
这些特定的“加工和处理过程”是怎样进行的?
简单地说,HttpContext对象经过“生产流水线”的不同部分时,HttpApplication对象会先后激发出一连串的事件。一种特定的组件——HTTP模块(HTTP Module)可以响应这些事件,在此事件响应代码中可以对HttpContext对象进行“加工和处理”,从这个意义上说,HTTP模块可以看成是“生产流水线”中的工人。HTTP模块其实就是前面所介绍过的“ISAPI筛选器”。
HTTP模块对象是在HttpApplication对象的InitModules()方法中被创建的,我们一般在HTTP模块对象Init()方法中书写代码使其可以响应HttpApplication对象所激发的特定事件。
ASP.NET提供了一些预定义的HTTP模块响应特定的事件,Web软件工程师也可以编写自己的HTTP模块并将其插入到“HTTP请求处理管线”中。
在流水线的中部(处理完了相关的事件),HttpContext对象被最终的Page对象所接收(这就是为何可以在ASP.NET页面中通过Page类定义的Context属性访问HttpContext对象的原因)。
每个被访问的ASP.NET页面都会被转换为一个“派生自Page类的页面类”。
注意:Page类实现了IHttpHandler接口,此接口定义了一个ProcessRequest()方法。
ASP.NET页面类生成以后被自动编译为程序集,然后其ProcessRequest()方法被自动调用(因为Page类实现了IHttpHandler接口,所以肯定有此方法)。在此方法中,Web软件工程师编写的代码被执行(如果有的话)。ProcessRequest()方法的执行结果再次被HttpContext对象所承载,控制又转回到“HTTP请求处理流水线”中,HttpApplication对象继续激发后继的事件。这时,如果还有特定的HTTP模块响应这些事件,则它们会被自动调用。
HttpContext对象带着最后的处理结果来到了“HTTP请求处理管线”的未端,其信息被取出来,再次以aspnet_isapi.dll为桥梁传送给工作者进程。工作者进程再将HTTP请求的处理结果转给HTTP.SYS,由它负责将结果返回给浏览器。
根据前面的介绍,可以将整个Http管线分成三段:预处理阶段à处理阶段à后处理阶段(图 8‑14)。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 414.75pt; HEIGHT: 222.75pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/Users/JINXUL~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.emz"></imagedata></shape>
图 8‑14 HTTP管线的三个阶段
如图 8‑14所示,HTTP管线的预处理和后处理阶段主要由多个HTTP模块参与,通过事件来驱动,这两个阶段完成的工作主要是对HttpContext对象的各种属性进行修改。
对HTTP请求的处理过程最终是由一个实现IHttpHandler接口的对象在“处理阶段”完成的。每一个ASP.NET网页生成的页面类都实现了此接口。创建出合适的HTTP请求处理对象的工作由PageHandlerFactory对象负责完成。
由此可见,实现了IHttpHandler接口的对象负责处理HTTP请求,这就是它被称为“Handler(处理程序)”的原因。
除了最常见的ASP.NET网页之外,Web软件工程师还可以创建自己的实现了IHttpHandler接口的对象,并将其插入到HTTP管线中用于处理HTTP请求。
当HTTP请求处理完毕,相关的对象被释放,但创建的应用程序域,以及HttpApplication等对象仍然存活,以响应下一次HTTP请求。
7 ASP.NET应用程序生命周期小结
本节中介绍了ASP.NET应用程序的生命周期,这是一个相当复杂的过程,也许用以下通俗的类比更容易理解:
l “HTTP请求处理管线”就是一条现代工厂中的“生产流水线”,HttpContext对象就是这条流水线上要加工的产品。
l HttpHandler(HTTP处理程序)对象是整个“产品生产线”的核心,由它负责将产品装配成形。
l HttpModule(HTTP模块)相当于“生产线”上的辅助工人,他们对产品(HttpContext对象)进行“预处理”(为装配产品作准备)和“后处理”(为产品出厂作准备,比如贴商标)。
l HttpApplication对象是整个“生产线”的“领导” ,他负责给“生产线”分配工人(初始化并装载所有注册的HttpModule),然后会激发一系列的事件(被称为“ASP.NET应用程序事件”),特定的HttpModule负责响应特定的事件。
分享到:
相关推荐
### ASP.NET 应用程序生命周期详解 #### 一、引言 ASP.NET 是 Microsoft 开发的一个框架,旨在帮助开发者创建动态网页、Web 应用和服务。随着 Web 技术的发展,Microsoft 在 IIS7.0 中引入了一种新的集成管道模型,...
ASP.NET生命周期是Web应用程序开发中的核心概念,它涵盖了从客户端浏览器发起请求到服务器响应的整个过程。这个生命周期涉及多个阶段,对于理解和优化ASP.NET应用程序的性能至关重要。 首先,当一个HTTP请求到达Web...
在"Asp.Net底层解析(四)——应用程序生命周期与HttpModule"中,我们可能看到了如何在`Init()`方法内订阅`BeginRequest`、`EndRequest`等事件的例子。`BeginRequest`事件在每个请求开始时触发,可以用于预处理数据...
ASP.NET分布式数据应用程序高级编程.pdf
熟练掌握.NET框架、理解Web应用生命周期、精通各种开发模式,以及具备良好的安全性意识,都是在这个领域取得成功的关键。通过学习和实践,开发者可以构建出满足业务需求、适应未来变化的高质量Web应用。
这个程序的核心功能包括用户注册和登录,涉及到的关键技术主要包括ASP.NET Web Forms、页面生命周期管理、视图状态、服务器控件、数据验证、以及用户会话管理。 首先,ASP.NET Web Forms是ASP.NET框架的一部分,它...
ASP.NET Web应用程序开发是微软公司推出的用于构建动态网站、Web应用程序和Web服务的框架。它基于.NET Framework,提供了丰富的功能和工具,使开发者能够高效地创建高性能、安全性和可伸缩性的Web解决方案。 在开发...
ASP_NET 应用程序生命周期概述.mht
1. ASP.NET基础知识:介绍ASP.NET的核心概念,如页面生命周期、控件事件模型。 2. Web Forms:讲解如何使用Web Forms创建交互式Web应用。 3. ASP.NET MVC:深入探讨MVC模式在Web开发中的应用。 4. ASP.NET Web API:...
将ASP.NET Core应用程序部署至生产环境中(CentOS7) 将ASP.NET Core应用程序部署至生产环境中(CentOS7) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
这是对ASP.NET应用程序生命周期的简介,只有一页内容,需要的可以下载,没有分的,可以给我发邮件索取,注明要什么东西。tutuzzg@163.com
这篇文章将详细介绍 Asp.net 应用程序对象和页面生存周期的各个方面,包括 HttpApplication 对象、HttpContext 对象、HttpModule 模块、Page 生命周期等。 一、HttpApplication 对象 HttpApplication 对象是 Asp...
6. **控件和生命周期**:ASP.NET提供了丰富的内置控件,如按钮、文本框等,这些控件有自己的生命周期,包括初始化、加载、回发和卸载等阶段。 7. **数据绑定**:ASP.NET提供了强大的数据绑定机制,可以方便地将数据...
2. ASP.NET页面生命周期:在ASP.NET中,每个.aspx页面都有一个生命周期,包括初始化、加载、验证、呈现和卸载等阶段。开发者可能在这些阶段中编写代码,以控制页面的行为。 3. 控件和事件处理:ASP.NET提供了丰富的...
9. **AJAX与Web Services**:可能讲解了如何结合ASP.NET与AJAX技术实现异步更新,以及如何使用Web Services和WCF进行远程通信。 10. **最佳实践**:书中可能会分享一些开发ASP.NET应用程序的最佳实践,包括代码组织...
1. **ASP.NET页面生命周期**:每个ASP.NET页面都经历一系列的生命周期阶段,包括初始化、加载、验证、呈现和卸载。理解这些阶段对于优化代码和处理用户交互至关重要。 2. **控件**:ASP.NET提供了多种内置控件,如...
同时,了解ASP.NET的生命周期,包括页面生命周期和控件生命周期。 2. **C#语言基础**:作为ASP.NET的主要编程语言,C#的基本语法、类、对象、继承、多态等概念是学习ASP.NET的前提。 3. **Web控件**:学习如何使用...