ASP.NET页面周期学习笔记之一

一.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,Render 3.步凑详解: 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 获得Session 11.PreRequestHandlerExecute 准备执行页面对象(执行事件处理程序。) * 执行页面对象的ProcessRequest方法 12.PostRequestHandlerExecute 执行完页面对象了 ***********注意:能使用到Session******************* 13.ReleaseRequestState 释放请求状态 14.PostReleaseRequestState 已释放请求状态 (在PostReleaseRequestState 事件之后,响应筛选器(如果有)将对输出进行筛选。) 15.UpdateRequestCache 更新缓存 16.PostUpdateRequestCache 已更新缓存 17.LogRequest 日志记录 18.PostLogRequest 已完成日志 19.EndRequest 完成请求

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小尘哥的专栏

thymeleaf中使用layui

头部引入css,尾部引入js,定义两个模板(一个也可以,里面的碎片分开写,我喜欢写两个分别引入),注意th:fragment,fragment即碎片,可以在模板...

1.1K60
来自专栏刘望舒

React Native入门(二)Atom+Nuclide安装、配置与调试

前言 上一篇文章我们搭建了开发环境,并写了个Hello World。这一节我们来学习React Native的开发IDE:Atom+Nuclide的安装、配置与...

42650
来自专栏守望轩

Visual Studio 2008 每日提示(十三)

#121、如何设置vs启动时(工作区)加载内容 原文链接:How to customize what Visual Studio opens to 操作步骤:...

37380
来自专栏企鹅号快讯

小程序开发的40个技术窍门,纯干货!

微信小程序正式上线一周时间,相关话题持续升温。现在为大家筛选出小程序开发实战需要注意的40个技术点,供大家参考! ? 小程序开发的40个技术窍门 1 Q:为什么...

270100
来自专栏阮一峰的网络日志

窗口管理器 xmonad 教程

开发者最需要的,就是一个顺手的开发环境。 ? 每个人的偏好不一样,我的开发环境是 Fish Shell + Xfce + xmonad + Vim,已经用了好多...

419110
来自专栏技术点滴

使用Atom打造无懈可击的Markdown编辑器

一直以来都奢想拥有一款全能好用的Markdown编辑器,直到遇到了Atom。废话不多说,直接开搞!

23320
来自专栏Java技术分享

基于Metronic的Bootstrap开发框架经验总结(6)--对话框及提示框的处理和优化

在各种Web开发过程中,对话框和提示框的处理是很常见的一种界面处理技术,用得好,可以给用户很好的页面体验,Bootstrap开发也一样,我们往往在页面新增、编辑...

31750
来自专栏刘望舒

React Native探索之Atom+Nuclide安装、配置和调试

11210
来自专栏前端大白专栏

react-native icon使用方式

19940
来自专栏微信公众号:Java团长

Intellij IDEA神器居然还有这些小技巧

Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜。出于对Intellij IDEA的喜爱,我决定写一个与其相关的专...

12720

扫码关注云+社区

领取腾讯云代金券