[生命周期] IIS 5.0、IIS 6.0、IIS 7.0 下 ASP.NET 应用程序生命周期

[生命周期] IIS 5.0、IIS 6.0、IIS 7.0 下 ASP.NET 应用程序生命周期

前言:

最近一直在看ASP.NET管线、IIS的两种模式、以及请求的生命周期等,之前写过一篇文章IIS 7.0 集成模式和经典模式 的区别,介绍两种模式简单的差异,今天着重介绍一下客户端请求在两种模式下的生命周期,以及这生命周期事件。我们可以将IIS 7之前归为一类叫做经典模式,IIS 7 之后包括IIS7 归为一类叫做集成模式
 
概述:
                                                                                                【IIS 5.0 和 6.0 的ASP.NET应用程序生命周期概述】
 
客户端发出的请求到达IIS服务器后,会经过两个阶段,第一个阶段是为该请求创建一个运行时,或者说是搭建一个环境;第二个阶段是通过一些列的事件处理模块,Handler处理和页面对象,简称 MHPM(Module、Handler、Page and Module Event)如下图:
生命周期概述及经历的几个阶段
 
阶段1:用户从Web服务器请求应用程序资源
    ASP.NET 应用程序生命周期以用户请求Web服务器(对于ASP.NET一般为 IIS服务器)为起点,服务器中的HTTP.SYS(运行在Windows内核模式的一个组件,主要负责侦听外部http请求,根据url请求地址,将请求转发到对应的应用程序池[这样,请求与IIS建立起联系了],由运行在运行程序池中的工作进程[Work Process]响应该请求)接收到请求后会对请求的后缀名进行检查,确定应由哪个扩展来处理该请求,然后将交由合适的ISAPI扩展(对于ASP.NET 扩展为:aspnet_isapi.dll [非托管][这里如果是 IIS7.0 集成模式,不判断后缀名,直接则交由System.Web.UI.PageHandlerFactory[托管]来响应此请求]
   
阶段2:ASP.NET 接收对应程序的第一个请求
    当ASP.NET 接收到对应程序中任何资源的第一个请求时,名为 ApplicationManager 的类会创建一个应用程序域(AppDomain),应用程序域为全局变量提供程序隔离,并允许单独卸载每个应用程序;在应用程序域中,将为名为 HostingEvironment 的类创建一个实例,该实例提供对有关程序的信息访问。
    
 
阶段3:为每个请求创建ASP.NET核心对象
    创建完 HostingEvironment 实例后,将创建并初始化核心对象。如:HttpContextHttpRequest HttpResponse,其中 HttpRequest 对象 包含了当前请求信息及Cookiev、浏览器信息等,HttpResponse 对象 包含发送到客户端的响应和Cookie。
 
阶段4:将 HttpApplication 分配个请求
    初始化所有核心对象之后,将通过创建 HttpApplication 的实例来启动程序,如果应用程序具有 Global.asax 文件,则ASP.NET会创建 Global.asax类的一个实例,并使用该派生类表示应用程序。
注:第一次应用程序请求ASP.NET页或进程时,会创建HttpApplication新实例,不过为了尽可能提高性能,可对多个请求重复使用 HttpApplication 实例
 
    
 
阶段5:由 HttpApplication 管线处理请求 MHPM(Module,Handler,Page and Module Event)
    
    步骤1(M:HttpModule):客户端开始处理请求
    步骤2(H:HttpHandler):一旦上个步骤6个时间处理完,asp.net引擎就会调用 ProcessRequest 事件
    步骤3(P:Page Events):一旦HttpHandler执行,asp.net 页面对象被创建,Page 对象的时间也将被调用。
    步骤4(M:HttpModule):一旦页面对象执行和从内存中卸载,HttpModule 提供网页执行事件可以用来注入自定义处理逻辑。
 
触发部分事件如下:
 
部分   Event事件 Description描述
HttpModule BeginRequest 在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。BeginRequest 事件发出信号表示创建任何给定的新请求。此事件始终被引发,并且始终是请求处理期间发生的第一个事件。
HttpModule AuthenticateRequest 当安全模块已建立用户标识时发生。AuthenticateRequest 事件发出信号表示配置的身份验证机制已对当前请求进行了身份验证。
HttpModule AuthorizeRequest 安全模块已验证用户授权时发生。AuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。
HttpModule ResolveRequestCache 在 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务后发生,从而绕过事件处理程序(例如某个页或 XML Web services)的执行。
HttpModule AcquireRequestState 当 ASP.NET 获取与当前请求关联的当前状态(如会话状态)时发生。AcquireRequestState 事件在创建了事件处理程序之后引发。
HttpModule PreRequestHandlerExecute 恰好在 ASP.NET 开始执行事件处理程序(例如,某页或某个 XML Web services)前发生。
HttpHandler ProcessRequest Httphandler逻辑被执行。 在本节中,我们会写,需要将每页扩展执行的逻辑。
Page Init

OnInit 方法执行创建 Page 实例所需的初始化和设置步骤。在页生命周期的此阶段中,页中声明的服务器控件都已初始化为默认状态;但每个控件的视图状态尚未填充。在 Page_Init 阶段中,页中的控件不能访问该页的其他服务器控件,无论其他控件是子控件还是父控件。不一定会创建其他服务器控件,也不一定能够访问它们

Page Load ASP.NET控件完成加载,你写的UI操作逻辑或任何其他逻辑在这里。
Page Validate 如果你有你的页面上有验证逻辑,这里检查是否符合验证。
  Render 将页面最终的输出发送到浏览器,如果你想做出一些最终的HTML的变化,这是输出到浏览器,你可以在这里输入你的HTML的逻辑。
Page Unload 页面对象从内存中卸载。
HttpModule PostRequestHandlerExecute 在 ASP.NET 事件处理程序(例如,某页或某个 XML Web service)执行完毕时发生。
HttpModule ReleaserequestState 在 ASP.NET 执行完所有请求事件处理程序后发生。该事件将使状态模块保存当前状态数据。引发ReleaseRequestState 事件以后,应用程序以该请求结束,并发出 ASP.NET 信号以存储该请求状态。
HttpModule UpdateRequestCache Before you end, if you want to update your cache.结束之前,如果您想更新您的高速缓存。
HttpModule EndRequest 当 ASP.NET 执行完事件处理程序以使缓存模块存储将用于从缓存为后续请求提供服务的响应时发生。
 
 
 
HttpModule 和 HttpHandler 的区别:
HttpModule:通过在某些事件中注册,把自己插入到ASP.NET处理管道中,当这些事件发生的时候,ASP.NET调用对应的HTTP模块,这样模块就可以处理请求了。
    用途:判断用户是否登陆
HttpHandler :是Http请求真正的处理中心,真正对客户端请求的服务做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中,再次返回到 HttpModule
 
 
                                                                                                【IIS 7.0 的ASP.NET应用程序生命周期概述】
 
IIS 7.0 的经典模式当然和 IIS 6.0、IIS 5.0 的行为是一样的,如上所述,这里主要讨论IIS 7.0的集成模式;集成模式是一种统一的请求处理管道,及时是像html这样的静态资源,IIS也会用托管代码块去处理。注:实现 IHttpModule 接口的托管代码块,可以访问请求管道内所有时间。
 
阶段1:发出一个对应程序资源的请求
    在IIS7.0 集成模式下,由一个统一的管道处理所有的请求,当集成模式管道接收到请求后,这些请求会经历一些相同的事件,这些事件由 RequestNotification 枚举表示。所有请求都可以配置和使用ASP.NET功能。
 
阶段2:统一管道接收对应程序的第一个请求:
    将为 ApplicationManager 创建一个实例,该实例就是处理请求的应用程序域(AppDomain),应用程序域为全局变量提供程序分离,并允许单独卸载每个应用程序;在应用程序域中,将为 HostingEnvironment 创建实例,该实例提供相关程序信息访问。
 
阶段3:为每个请求创建响应对象
    创建完 HostingEvironment 实例后,将创建并初始化核心对象。如:HttpContextHttpRequest 和 HttpResponse,其中 HttpRequest 对象 包含了当前请求信息及Cookiev、浏览器信息等,HttpResponse 对象 包含发送到客户端的响应和Cookie。这块的关键区别在于 可以访问 HttpRequest  HttpResponse 更多的属性对象。
 
阶段4:将 HttpApplication 分配个请求
    同 IIS6.0 的阶段4.
 
阶段5:由HttpApplication 管线处理请求
    处理请求是 HttpApplication 会执行一下任务。
  1. 对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参见 ValidateRequest脚本侵入概述

  2. 如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。

  3. 引发 BeginRequest 事件。

  4. 引发 AuthenticateRequest 事件。

  5. 引发 PostAuthenticateRequest 事件。

  6. 引发 AuthorizeRequest 事件。

  7. 引发 PostAuthorizeRequest 事件。

  8. 引发 ResolveRequestCache 事件。

  9. 引发 PostResolveRequestCache 事件。

  10. 引发 MapRequestHandler 事件。将根据所请求资源的文件扩展名,选择相应的处理程序。处理程序可以是本机代码模块,如 IIS 7.0StaticFileModule,也可以是托管代码模块,如 PageHandlerFactory 类(它处理 .aspx 文件)。

  11. 引发 PostMapRequestHandler 事件。

  12. 引发 AcquireRequestState 事件。

  13. 引发 PostAcquireRequestState 事件。

  14. 引发 PreRequestHandlerExecute 事件。

  15. 为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版IHttpAsyncHandler.BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。

  16. 引发 PostRequestHandlerExecute 事件。

  17. 引发 ReleaseRequestState 事件。

  18. 引发 PostReleaseRequestState 事件。

  19. 如果定义了 Filter 属性,则执行响应筛选。

  20. 引发 UpdateRequestCache 事件。

  21. 引发 PostUpdateRequestCache 事件。

  22. 引发 LogRequest 事件。

  23. 引发 PostLogRequest 事件。

  24. 引发 EndRequest 事件。

  25. 引发 PreSendRequestHeaders 事件。

  26. 引发 PreSendRequestContent 事件。

     
 
部分资料转自:
1. ASP.NET应用程序与页面生命周期:http://www.cnblogs.com/suizhouqiwei/archive/2012/08/15/2637775.html
2. 三张图说明ASP.NET生命周期:http://blog.csdn.net/sundacheng1989/article/details/10468393
3. msdn  IIS5.0  IIS6.0 应用程序生命周期概述:https://msdn.microsoft.com/zh-cn/library/ms178473(d=printer,v=vs.100).aspx
 
4. msdn IIS7.0 应用程序生命周期概述:https://msdn.microsoft.com/zh-cn/library/bb470252(v=vs.100).aspx
 
 
下面介绍一下  ASP.NET MVC 的生命周期,其实MVC的生命周期是建立在 ASP.NET生命周期之上,只是MVC的URLRoutingModule对进入服务器的请求进行了拦截,然后对此次请求的handler进行特殊处理,总结来说ASP.NET的生命周期是webform和mvc的基础,webform是通过Page这个Handler,Mvc使用的是MvcHandler.
 
posted @ 2019-04-16 06:24  NCat  阅读(592)  评论(0)    收藏  举报