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 条评论
登录 后参与评论

相关文章

来自专栏刘望舒

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

991
来自专栏技术点滴

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

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

1852
来自专栏重庆的技术分享区

Vim定制化简介

Vim是几乎所有Unix系统中都会存在的少数文本编辑器之一。虽然最初的学习曲线是不可避免的,但Vim的目标是成为一个高效的文本编辑器,并提供一个根据用户喜好可配...

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

窗口管理器 xmonad 教程

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

38811
来自专栏macOS 开发学习

一步一步,开始上手Mac 开发(一)

通过本文,你可以创建你的第一个Mac Application,编译并指定版本号,而且经过练习,你应该掌握:

1873
来自专栏web开发

前后端分离跨服务器文件上传-Java SpringMVC版

 近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码。 一、Tomcat服务...

2.9K8
来自专栏极客猴

Django 学习笔记之表单

本文是自己 Django 学习笔记系列中第 8 篇,算是基础知识篇章中最后一篇笔记。后续的笔记内容会相对比较综合。所以建议大家要把前面的内容,包括本篇笔记掌握。...

1063
来自专栏张戈的专栏

原创插件:WordPress博客友好对话框+文章随机推荐滚动条插件(附代码版)

双 11 光棍节,我在博客发布了一篇给博客部署一个友好对话框的教程,用了几天感觉非常不错!就进一步折腾了一下,目前这个 js 已实现以下多种功能: 一、功能描述...

46912
来自专栏前端大白专栏

react-native icon使用方式

1694
来自专栏刘望舒

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

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

3795

扫码关注云+社区