一.ASP.NET 页面生命周期理解——重中之重的Key
ASP.NET页面生命周期——理解:重中之重!!!
1.基本概念:所谓的页面生命周期,指的是一个ASP.NET页面类对象从初始化到销毁经过的步凑过程;2.大致步凑:(1)初始化:PreInit,Init,InitComplete(2)加载数据和页面:LoadState,ProcessPostData,PreLoad,Load,ProcessPostData(第二次)...(3)触发事件:ChangedEvents PostBackEvent(4)保存状态并呈现页面:SaveState,SaveStateComplete,Render3.步凑详解:ProcessRequestMain->PreInit-PerfromPreInit()->预初始化:准备初始化页面控件,设置皮肤;Init-InitRecursive(null)->页面对象初始化;InitComplete(OnInitComplete-EventArgs.Empty)->页面对象初始化完成:加载ViewState,还原控件状态,登记用户触发的事件;if(this.IsPostBack){ LoadState-LoadAllState():加载ViewState->ProcessPostData-ProcessPostData(this._requestValueCollection,true):还原控件状态}->PreLoad-OnPreLoad(EventArgs.Empty)->Load-LoadRecursive()->if(this.IsPostBack){ ProcessPostData Second Try-ProcessPostData(this._leftoverPostData,false)->Raise ChangedEvents-RaiseChangedEvents()->Raise PostBackEvent-RaisePostBackEvent(this._requestValueCollection);):触发控件事件}->SaveStateComplete-OnSaveStateComplete(EventArgs.Empty):保存页面和控件数据到ViewState->Render->RenderControl(this.CreateHtmlTextWriter(this.Response.Output)):生成最终HTML代码二、ProcessRequestMain()方法执行步凑
1.根据是否包含_VIEWSTATE设置IsPostBack属性是否为True
2.LoadAllState(),将隐藏域_VIEWSTATE的值装入页面对象的ViewState属性中3.第一次调用ProcessPostData(),将属性ViewState里包含的服务器控件的属性值重新还原到对应的服务器控件中4.Load 我们最常使用的Page_Load方法5.第二次调用ProcessPostData()6.Raise ChangedEvents 用来为服务器端控件准备当前触发的事件7.Raise PostBackEvent 执行前面标志好的服务器端控件所触发的事件8.PreRender 准备生成HTML代码9.SaveState 将控件的最后属性及用户定义的最后值放到ViewState中[生成隐藏域]10.Render 生成整个页面的HTML代码三、HttpApplication 事件处理过程
HttpApplication 类的实例是在 ASP.NET 基础结构中创建的,而不是由用户直接创建的。HttpApplication 类的一个实例在其生存期内被用于处理多个请求,但它一次只能处理一个请求。这样,成员变量才可用于
存储针对每个请求的数据。应用程序按照以下顺序执行由 global.asax 文件中定义的模块或用户代码处理的事件:
1.BeginRequest 开始处理请求(在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生)
2.AuthenticateRequest 授权验证成功,获取用户授权信息(当安全模块已建立用户标识时发生。注:AuthenticateRequest 事件发出信号表示配置的身份验证机制已对当前请求进行了身份验证。预订 AuthenticateRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证。)3.PostAuthenticateRequest 获取成功 (注意:该事件在 .NET Framework 2.0 版中是新增的。 当安全模块已建立用户标识时发生。PostAuthenticateRequest 事件在 AuthenticateRequest 事件发生之后引发。预订 PostAuthenticateRequest 事件的功能可以访问由 PostAuthenticateRequest 处理的任何数据。)4.AuthorizeRequest 授权,一般用来检查用户是否获得权限 (当安全模块已验证用户授权时发生。AuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。预订 AuthorizeRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证和授权。)5.PostAuthorizeRequest 获得授权 (.NET 2.0里新增的事件。在当前请求的用户已获授权时发生。PostAuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。预订PostAuthorizeRequest 事件可确保在处理附加的模块或处理程序之前对请求进行身份验证和授权。)6.ResolveRequestCache 获取页面缓存结果(当 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务时发生,从而跳过事件处理程序(例如某个页或 XML Web services)的执行。)7.PostResolveRequestCache 已获取缓存(在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生。)在 PostResolveRequestCache 事件之后、PostMapRequestHandler 事件之前创建一个事件处理程序(对应于请求 URL 的页)。8.PostMapRequestHandler 创建页面对象(在 ASP.NET 已将当前请求映射到相应的事件处理程序时发生。)9.AcquireRequestState 获取Session ***********注意:能使用到Session******************* 先判断当前页面对象是否实现了IRequiresSessionState接口,如果实现了则从浏览器发来的请求报文头中获得SessionID,并且到服务器的Session池中获得对应的Session对象,最后赋值给HttpContext上下文对象的Session属性。10.PostAcquireRequestState 获得Session11.PreRequestHandlerExecute 准备执行页面对象(执行事件处理程序。)* 执行页面对象的ProcessRequest方法12.PostRequestHandlerExecute 执行完页面对象了 ***********注意:能使用到Session*******************13.ReleaseRequestState 释放请求状态14.PostReleaseRequestState 已释放请求状态 (在PostReleaseRequestState 事件之后,响应筛选器(如果有)将对输出进行筛选。)15.UpdateRequestCache 更新缓存16.PostUpdateRequestCache 已更新缓存17.LogRequest 日志记录18.PostLogRequest 已完成日志19.EndRequest 完成请求