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 完成请求

时间: 2024-10-27 19:47:24

ASP.NET页面周期学习笔记之一的相关文章

ASP.Net WebForm温故知新学习笔记:一、aspx与服务器控件探秘

开篇:毫无疑问,ASP.Net WebForm是微软推出的一个跨时代的Web开发模式,它将WinForm开发模式的快捷便利的优点移植到了Web开发上,我们只要学会三步:拖控件→设属性→绑事件,便可以行走于天下.但这样真的就可以走一辈子吗?实际上,ASP.Net经常被喷的诟病就在于WebForm以及只会拖控件的ASP.Net程序员,往往大型互联网系统也没有采用WebForm的模式进行开发.但是,WebForm并不是一无是处,而是我们没有用好,还有很多东西我们知其然不知其所以然,现在我们就来对这些平

ASP.NET Web Pages ----学习笔记(二)

C#主要Razor语法规则: Razor代码块由@{...}包围 行内表达式以@开始 代码语句以分号结束 变量通过var关键词进行声明 字符串用引用来包围 C#代码对大小写敏感 C#文件的扩展名是.cshtml 内容块 @RenderPage()从不同的文件导入内容 使用布局页面 @RenderBody()内容页必须以Layout指令开头 防止代码泄露 在ASP.NET中,名称以下划线开头的文件无法通过Web来浏览 隐藏敏感信息 在ASP.NET中,隐藏敏感信息常用方法是把这些信息保存在名为"_

测试Servlet生命周期学习笔记

测试环境:windows xp旗舰版 软件环境:myclipse8.5+tomcat7.0 ********************************************************************************* 操作方法: 1.新建工程: File-->new-->Java Project-->TestServlet(工程名称)-->Finish. 2.加载servlet-api.jar类包: TestServlet(右键)-->B

Asp.Net Core WebApi学习笔记(四)-- Middleware

Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Middleware功能支持. 在演示Middleware功能之前,先要了解一下Asp.Net管道模型发生了什么样的变化. 第一部分:管道模型 1. Asp.Net管道 在之前的Asp.Net里,主要的管道模型流程如下图所示: 请求进入Asp.Net工作进程后,由进程创建HttpWorkRequest对象

CSS3与页面布局学习笔记(八)——浏览器兼容性问题与前端性能优化方案

一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运行平台还存在差异.屏幕分辨率不一样,大小不一样,比例不一样.兼容性主要可以分类为: 1).CSS兼容2).JavaScript兼容3).HTML兼容 这三类也是前端的主要组成部分,都存在一定的兼容性问题,知己知彼,百战百胜,我们先了解浏览器的发动机—内核. 多年前我们一直为IE6兼容烦恼,为它没少加

.NET MVC页面生命周期及传统ASP.NET页面周期

目前我主要使用.Net MVC框架进行网页创建,数据库是MSSQL Server.所以,我就用.NET MVC框架的web页面周期来说明页面的生命周期,但是我觉着其他MVC框架也是大同小异的. 本文主要分两个部分 一..NET MVC的网页生命周期 二.普通ASP.NET的网页生命周期 一..NET MVC的网页生命周期 ASP.NET MVC请求从开始到结束的每一个过程,在浏览器输入URL并敲击回车来请求一个ASP.Net MVC网站的页面之后发生的任何事情,都是页面的生命周期的一部分. 为什

CSS3与页面布局学习笔记(四)——页面布局大全

一.负边距与浮动布局 1.1.负边距 所谓的负边距就是margin取负值的情况,如margin:-100px,margin:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见的功能如下: 1.1.1.向上移动 当多个元素同时从标准流中脱离开来时,如果前一个元素的宽度为100%宽度,后面的元素通过负边距可以实现上移.当负的边距超过自身的宽度将上移,只要没有超过自身宽度就不会上移,示例如下: <!DOCTYPE html> <html> <head> &

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入

本篇将介绍Asp.Net Core中一个非常重要的特性:依赖注入,并展示其简单用法. 第一部分.概念介绍 Dependency Injection:又称依赖注入,简称DI.在以前的开发方式中,层与层之间.类与类之间都是通过new一个对方的实例进行相互调用,这样在开发过程中有一个好处,可以清晰的知道在使用哪个具体的实现.随着软件体积越来越庞大,逻辑越来越复杂,当需要更换实现方式,或者依赖第三方系统的某些接口时,这种相互之间持有具体实现的方式不再合适.为了应对这种情况,就要采用契约式编程:相互之间依

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(十)-- 发布(Windows)

本篇将在这个系列演示的例子上继续记录Asp.Net Core在Windows上发布的过程. Asp.Net Core在Windows上可以采用两种运行方式.一种是自托管运行,另一种是发布到IIS托管运行. 第一部分.自托管 一.依赖.Net Core环境 修改 project.json 文件内容,增加发布时需要包含文件的配置内容 1 { 2 "version": "1.0.0-*", 3 "testRunner": "xunit&quo