管道及页面生命周期

客户端请求发送到服务器进入管道执行页面生命周期:

  客户发送请求到服务器,服务器通过扩展名扫描映射表,交给对应的扩展程序(aspnet_isapi.dll),扩展程序把请求传入framwork,即调用ISAPIRuntime pr方法,调用HttpRuntime pr方法,会创建HttpWorkerRequest,将请求封装到HttpContext,通过HttpApplicationFactory创建HttpApplication负责处理整个请求--调用pr方法,将HttpContext传入application,进去请求管道。在第8到9个事件间根据HttpContext里的HttpRequest找到被请求报文里的页面路径,根据反射创建页面对象,转成IHttpHandler接口对象。执行11,12事件之间调用前面创建页面的pr方法,同时将上下文传入。执行完后调用FinishRequest方法,生成响应报文,通过HttpWorkerRequest将响应报文发回给扩展程序,交给iis,iis通过套接字将响应报文发给浏览器。

第8个事件:--PostMapRequestHandler反射创建页面对象,并转成IHttpHandler接口对象。

第9-11个事件:有一个事件会先尝试将页面类对象转成IRequiresSessionState接口对象,如果转换不成功则不加载session对象,转换成功则从请求报文头中获得Cookie里的sessionid,然后到服务器的session池中找到对应的session对象赋给上下文中的session对象。

第11-12个事件:执行页面对象pr方法,调用页面FrameWorkInitialize() 调用_buildControlTree()方法打造控件树,执行页面生命周期。将上下文中session对象赋给page对象的session属性。

_buildControlTree()方法构造控件树

每个控件都有Controls属性来保存它的子节点

LoadState:分析请求报文里名为_VIEWSTATE的隐藏域,将里面的字符串反base64编码,然后反序列化还原成集合对象;将其中用户添加的属性存入页面对象的ViewState属性中。同时将服务器端控件的属性值从隐藏域中还原。

PageLoad

SaveState:将所有服务器端控件的属性及值保存到ViewState属性中,最后在页面生成html代码的时候,遍历ViewState中的键值集合,然后将里面的序列化,将序列化后的字符串Base64编码生成名为_VIEWSTATE的隐藏域。

存入response

遍历控件树,调用每个控件的render方法(传入一个TextWrite对象)从而生成整个页面的html代码,每个控件生成的html代码都按照次序存在了同一个TextWrite中。当执行到HtmlForm表单控件时,此控件的Render方法里会去读取ViewState里的每个键值对,并将他们序列化成字符串,然后进行base64编码得到一个新的字符串,最终生成一个隐藏域存放字符串。

过滤器

IHttpModule

自定义管道

namespace MyModule

{

public class MyTestModule:IHttpModule

{

public void Init(HttpApplication context)

{

context.BeginRequest+=MyBeginRequest;

}

public void MyBeginRequest(object sender,EventArgs e)

{

HttpApplication application=sender as HttpApplication;

application.Context.Response.Write("我是在MyModule里注册到BeginRequest事件上的方法!");

}

}

}

配置网站web.config节点

<system.webServer>

<modules>

<add name="myModule" type="MyModule.MyTestModule"></add>

</modules>

</system.webServer>

请求管道中的19个事件.

(1)BeginRequest: 开始处理请求

(2)AuthenticateRequest授权验证请求,获取用户授权信息

(3):PostAuthenticateRequest获取成功

(4): AunthorizeRequest 授权,一般来检查用户是否获得权限

(5):PostAuthorizeRequest:获得授权

(6):ResolveRequestCache:获取页面缓存结果

(7):PostResolveRequestCache 已获取缓存

(8):PostMapRequestHandler 创建页面对象

(9):PostAcquireRequestState 获取Session

(10)PostAcquireRequestState 获得Session

(11)PreRequestHandlerExecute:准备执行页面对象

(12)PostRequestHandlerExecute 执行完页面对象了

(13)ReleaseRequestState 释放请求状态

(14)PostReleaseRequestState 已释放请求状态

(15)UpdateRequestCache 更新缓存

(16)PostUpdateRequestCache 已更新缓存

(17)LogRequest 日志记录

(18)PostLogRequest 已完成日志

(19)EndRequest 完成

时间: 2024-10-10 01:53:42

管道及页面生命周期的相关文章

【译】ASP.NET应用程序和页面生命周期

为何翻译此文 一.此文是Code Project社区2010年4月ASP.NET板块的最佳文章,说明了此文的份量: 二.锻炼自己的英文技术文章翻译能力,提高英文技术文档阅读能力: 三.了解掌握ASP.NET页面生命周期是非常必要的,这有助于我们更加灵活的控制页面,以我们需要的方式编程开发: 关于原文作者 原文作者:Shivprasad koirala 原文地址:http://www.codeproject.com/Articles/73728/ASP-NET-Application-and-Pa

ASP.NET Web 应用程序及页面生命周期

以客户端浏览器向 ASP.NET Web 应用程序页面发送请求(Request)为起点,以浏览器收到 Web 服务器的响应(Response)为终点,这一完整的过程被称为"应用程序及页面的生命周期". ASP.NET Web 页面生命周期开始之前发生了什么? 用户浏览器向 Web 服务器(IIS)发出资源的请求. Web 服务器收到请求,会根据请求文件的扩展名(如 .aspx..ascx..ashx..asmx),指定 ISAPI 扩展来处理该请求,这里提到的扩展名将会由 aspnet

ASP.NET学习笔记——webform页面生命周期

webform运行原理 运行原理相同点:aspx和ashx运行机制差不多. 运行原理不同点: 1.执行事件管道的时候,在7,8个事件之间创建的是前台页面类对象,那后台类是什么时候创建的呢?由于aspx前台页面继承自后台,所以创建前台页面类时,后台就创建好了. 2.在第11.12事件之间,调用存放在remapHandler中的前台页面类对象的processRequest方法,会进行复杂的处理,也就是走页面生命周期. webform页面生命周期 1.通过反编译,查看前台类代码 前台代码P01Inde

Asp.Net请求原理and页面生命周期

前天去面试,让我说下生命周期,本来之前就了解过,但是没说出来,被深深的鄙视了;今天弄了一上午,现在发到这分享一下,有什么错误请各位大牛们指出~~ 昨天面试,又遇到这问题了...  然后说了半天,人家问我一用户控件的周期在哪执行,我想了半天,也没有想出来,回来只好再研究了.. 请求的本页面Page-Load->用户自定义控件Page-Load->本页面渲染之前Page-PreRender    这样一个顺序 页面发送请求原理 浏览器将请求封装成Http请求报文发送到服务器; 服务器端HTTP.S

ASP.NET应用程序生命周期趣谈(四) HttpHandler和页面生命周期

在之前的三篇文章中,我们还算简明扼要的学习了asp.net的整个生命周期,我们知道了一个Request进来以后先去ISAPI Filter,发现是asp.net程序后又ASPNET_ISAPI.dll这个ISAPI Extension来进行处理.在ASPNT_ISAPI创建了Worder Process后,在管道中经过HttpModule的处理来到HttpHander的手中. 我们知道P_Handler程序员使用“乾坤大挪移”对页面进行了处理后又通过管道中的HttpModule把response

.net页面生命周期【转】

.Net 页面生命周期IIS 所收到的对某 Microsoft ASP.NET 页面的每个请求都被移交给 ASP.NET HTTP 管线.HTTP 管线由一系列托管对象组成,这些对象按顺序处理该请求,并完成从 URL 到普通 HTML 文本的转换.HTTP 管线的入口点是 HttpRuntime 类.ASP.NET 基础结构为辅助进程中所承载的每个 AppDomain (应用程序域)创建此类的一个实例请注意,该辅助进程为当前正在运行的每个 ASP.NET 应用程序维护一个不同的 AppDomai

【深入ASP.NET原理系列】--ASP.NET页面生命周期

前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我们才能在生命周期的合适阶段编写代码.如果我们能在写代码的时候想着我们现在是在做生命周期的哪一步那将是非常好的. 你可能会说我不清楚还不是一样写代码,反正每次都在Page_load里面写代码 然后页面就出来了我管那么多干什么.所谓知其然如果能知其所以然岂不是更吊?我个人认为做ASP.NET B/S开发

ASP.NET页面生命周期与控件生命周期

ASP.NET页面生命周期 (1)PreInit 预初始化(2)Init 初始化(3)InitComplete 初始化完成(4)PreLoad 预加载(5)Load 加载(6)LoadComplete 加载完成(7)PreRender 预输出(8)PreRenderComplete 预输出完成(9)Unload 卸载 ASP.NET控件生命周期 -- 实例化(Instantiate) 控件被页面或另一个控件通过调用它的构造器所实例化.这个步骤之后所列出的阶段,仅当控件加入控件树中才会发生. --

ASP.NET应用程序生命周期和ASPX页面生命周期图解

ASP.NET应用程序生命周期和ASPX页面生命周期图解,布布扣,bubuko.com