对于ASP.NET开发,排在前五的话题离不开请求生命周期。像什么Cache、身份认证、Role管理、Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了。抛开乌云见晴天,接下来就一步步揭开请求管道神秘面纱。
上篇回顾在介绍本篇内容之前,让我们先回顾下上一篇《ASP.NET运行时详解 集成模式和经典模式》的主要内容。在上一篇随笔中,我们提到ASP.NET运行时通过Application的InitInternal方法初始化运行管道。ASP.NET运行时提供了两种初始化管道模式,集成模式和经典模式。随后又分别介绍了两种模式下管道的初始化过程。那么,每个管道具体是做什么事以及管道具体是怎么执行的?接下来,本篇的内容会围绕着两个问题进行讲解。另外,上篇还遗留了页面的生命周期介绍。所以,本篇也会对页面生命周期做介绍。
管道步骤什么是请求管道?请求管道就是把Application的一系列事件串联成一条线,这些事件按照排列的先后顺序依次执行,事件处理的对象包括HttpModule、HttpHandler、ASP.NET Page。那么,在管道中具体包括哪些事件?下图概括了ASP.NET请求管道中包括的事件。
现在我们知道了管道包含的执行事件,但每个事件具体执行哪些操作?下面的列表简要列举了每个事件的执行的工作:
序号 事件 说明
1 BeginRequest 请求管道的第一个事件,当ASP.NET相应一个请求时就会被触发。
2 AuthenticateRequest 验证请求,开始检查用户身份,一般是获取请求的用户信息。
3 AuthorizeRequest 用户权限检查,未通过一般跳转到EndRequest事件。
4 ResolveRequestCache 当权限验证通过后,通过缓存模块提供服务,检查请求是否存在缓存,存在则直接返回缓存结果。
5 MapRequestHandler ASP.NET 基础结构使用 MapRequestHandler 事件来确定用于当前请求的请求处理程序。
6 AcquireRequestState 获取请求状态。
7 PreExecuteRequestHandler 在ASP.NET执行处理事件handler之前执行。
8 ExecuteRequestHandler 执行具体的Handler。
9 ReleaseRequestState 当 ASP.NET执行完请求的Handler后, State模块保存当前的状态数据。
10 UpdateRequestCache 缓存模块存储相应,提供给后面的请求缓存。
11 LogRequest 在ASP.NET生成日志之前触发。
12 EndRequest 结束当前请求。
13 SendResponse 发送请求响应。
列表简单的描述了管道中包含的事件,每个事件都可以通过HttpModule进行扩展。其实上面这些事件只是一个空架子,而实际干活的还是上一篇随笔中我们提到的HttpModule,ASP.NET默认实现了很多IHttpModule类,而这些类就是处理篇头提出的像Cache、身份认证、Role、Rounting等操作。接下来我们就One By One的分析这些Module具体做了什么操作。
之前我们有列举出了ASP.NET自身提供的IHttpModule,下表包含了ASP.NET自身提供的IHttpModule以及对应的类型:
序号 名称 类型
1 OutputCacheModule System.Web.Caching.OutputCacheModule
2 Session System.Web.SessionState.SessionStateModule
3 WindowsAuthentication System.Web.Security.WindowsAuthenticationModule
4 FormsAuthentication System.Web.Security.FormsAuthenticationModule
5 DefaultAuthentication System.Web.Security.DefaultAuthenticationModule
6 RoleManager System.Web.Security.RoleManagerModule
7 UrlAuthorization System.Web.Security.UrlAuthorizationModule
8 FileAuthorization System.Web.Security.FileAuthorizationModule
9 AnonymousIdentification System.Web.Security.AnonymousIdentificationModule
10 UrlMappingsModule System.Web.UrlMappingsModule
11 ServiceModel-4.0 System.ServiceModel.Activation.ServiceHttpModule, System.ServiceModel.Activation
12 UrlRoutingModule-4.0 System.Web.Routing.UrlRoutingModule
13 ScriptModule-4.0 System.Web.Handlers.ScriptModule, System.Web.Extensions
列表中的Module会被安插到管道的事件步骤上,但每个Module具体安插到哪一个管道事件上,我们还是不清楚。要了解清楚这些,我们不得不分析这13个Module的源代码。
13个IHttpModule源代码分析