.net asp 生命周期如图
[1] 客户端发送请求时提供的请求报文,在客户端发送请求时系统的Http.sys会监听发送的请求,将请求传送给iis。
注:Http.sys是位于Windows Server和Windows XP SP2中的操作系统核心组件。
此组件有存储、log记录、IP重用、将所有的请求给此的队列中传送不同负责的程序处理。
[2] 如何当请求的页面Http.sys所有缓存会直接取之于缓存,否则请求与IIS。
[3] IIS根据请求的扩展名进行判断是静态资源还是动态资源,如果是静态资源直接返回对应地址的内容,如果是动态资源会在IIS的处理程序映射中的配置找到由哪个扩展程序来处理。Asp.net一般有aspnet_isapi.dll来运行具体的请求。
[4] 在请求aspnet_isapi.dll是由W3WP.exe程序进行运行的。在aspnet_isapi中会首先调用ISAPIRuntime.ProcessRequest()方法,在此方法中会调用CreateWorkerRequest方法创建HttpWorkerRequest类,会判断是iis6还是iis7,并且会对请求报文进行封装一次。
[5] 将创建的HttpWorkerRequest会创建HttpRuntime,且会将worker 传入HttpRuntime.ProcessRequestNoDemand()中,此方法会创建HttpContext对象(初始化httpRequest和httpResponse)
[6] 在创建HttpContext之后紧接着会创建HttpApplication,且在创建过程中是通过HttpApplicationFaactory.GetApplicationInstance创建出来。
[7] Application会初始化事件管道。先会取config信息中的HttpModel,并注册,页面默认创建一个。然后会注册19的管道事件。
[8] 。
Section |
Event |
Description |
HttpModule |
BeginRequest |
此事件标志着一个新的请求,它保证在每个请求中都会被触发。 |
HttpModule |
AuthenticateRequest |
此事件标志ASP.NET运行时准备验证用户。任何身份验证代码都可以在此注入。 |
HttpModule |
AuthorizeRequest |
此事件标志ASP.NET运行时准备授权用户。任何授权代码都可以在此注入。 |
HttpModule |
ResolveRequest |
在ASP.NET中我们通常使用OutputCache指令做缓存。在这个事件中,ASP.NET运行时确定是否能够从缓存中加载页面,而不是从头开始生成。任何缓存的具体活动可以被注入这里。 |
HttpModule |
AcquireRequestState |
此事件标志着ASP.NET运行时准备获得Session会话变量。可以对Session变量做任何你想要做的处理。 |
HttpModule |
PreRequestHandlerExecute |
恰好在ASP.NET 开始执行事件处理程序前发生。可以预处理你想做的事。 |
HttpHandler |
ProcessRequest |
HttpHandler逻辑被执行。在这个部分我们将为每个页面扩展写需要的逻辑。 |
Page |
Init |
此事件发生在ASP.NET页面且可以用来: |
Page |
Load |
在这部分ASP.NET控件完全被加载且在这里你可以写UI操作逻辑或任何其他逻辑。NOTE:这个事件也是我们最常见且最常用的一个事件。 |
Page |
Validate |
如果在页面上你有验证器,你同样想在这里做一下检查。 |
Page |
Render |
是时候将输出发送到浏览器。如果你想对最终的HTML做些修改,你可以在这里输入你的HTML逻辑。 |
Page |
Unload |
页面对象从内存中卸载。 |
HttpModule |
PostRequestHandlerExecute |
可以注入任何你想要的逻辑,在处理程序执行之后。 |
HttpModule |
ReleaseRequestState |
如果你想要保存对某些状态变量的更改,例如:Session变量的值。 |
HttpModule |
UpdateRequestCache |
在结束之前,你是否想要更新你的缓存。 |
HttpModule |
EndRequest |
这是将输出发送到客户端浏览器之前的最后一个阶段。 |
Appliction的事件顺序:
Application_Start//应用开始,只在应用刚开始时执行一次
BeginRequest//作为执行的 HTTP 管道链中的第一个事件发生,当 ASP.NET 的请求做出响应。
AuthenticateRequest//当安全模块已建立的用户标识时出现。
PostAuthenticateRequest//当安全模块已建立的用户标识时出现。
AuthorizeRequest//安全模块已验证用户身份验证时发生。
PostAuthorizeRequest//安全模块已验证用户身份验证时发生。
ResolveRequestCache//当 ASP.NET 完成授权事件以便从缓存中,跳过的事件处理程序 (例如,一个页面或 XML Web 服务) 执行的请求提供服务的缓存模块时发生。
PostResolveRequestCache//ASP.NET 将绕过当前事件处理程序的执行,并允许缓存模块以处理从缓存请求时发生。
PostMapRequestHandler//当 ASP.NET 已映射到相应的事件处理程序的当前请求时出现。
AcquireRequestState//当 ASP.NET 获取与当前的请求相关联的当前状态 (例如,会话状态)。
PostAcquireRequestState//获取与当前的请求相关联的请求状态 (例如,会话状态) 时发生,从此开始处理页面的流程。
PreRequestHandlerExecute//ASP.NET 开始执行事件处理程序 (例如,一个页面或 XML Web 服务) 之前发生。
PostRequestHandlerExecute//当 ASP.NET 事件处理程序 (例如,一个页面或 XML Web 服务) 完成执行时发生。
ReleaseRequestState//当 ASP.NET 已完成执行所有请求事件处理程序和存储数据的请求状态时发生。
PostReleaseRequestState//当 ASP.NET 已完成执行所有请求事件处理程序和存储数据的请求状态时发生。
UpdateRequestCache//当 ASP.NET 完成更新的缓存模块和存储用于为从缓存中的后续请求提供服务的响应时发生。
PostUpdateRequestCache//当 ASP.NET 完成更新的缓存模块和存储用于为从缓存中的后续请求提供服务的响应时发生。
LogRequest//当 ASP.NET 完成更新的缓存模块和存储用于为从缓存中的后续请求提供服务的响应时发生。
PostLogRequest//当 ASP.NET 已完成处理的事件处理程序时发生 LogRequest 事件。
EndRequest//作为执行的 HTTP 管道链中的最后一个事件发生,当 ASP.NET 的请求做出响应。
Error 当引发未处理的异常时发生。
Application_End//引用结束
页面生命周期
PreInit--检查IsPostBack、动态控件主页
Init--页面中控件初始化完成,此可读取或者继续初始化
InitComplete--完成所有的初始化
PreLoad--
Load-- 加载所有控件
控件事件
LoadComplete
PreRender--对以上事件等操作后的首次渲染
SaveStateComplete --保存viewstate
Render -- 渲染
Unload--页面完毕