asp.net生命周期

当用户起一个请求到服务器,服务器接收到请求并将该页面返回给浏览器。

这一个看似简单的过程中间到底经历了什么?

我们可以称这一过程为页面的生命周期,即,一个页面从开始被请求到请求结束销毁的过程

而这其中aspx和ashx的生命周期又不一样,mvc的生命周期更是大不相同

首先仅讨论aspx和ashx

因为这两者的生命周期非常相似

不同点仅仅在于aspx多干了几件事情

这从ashx页面的ProcessRequest方法中可以看出一二(以下称ProcessRequest方法是pr方法)

首先

用户起一个请求到服务器

iis服务器接收到用户的请求,并判所请求的文件类型

如果是html,css,js,jpg等静态的文件

iis将会在本地磁盘上找到相关的文件直接发送回浏览器

这就是为什么静态页的相应速度比较快,要使用页面静态化技术的原因

如果是aspx,ashx甚至可能是php,jsp这种动态页面又该怎么处理呢?

在iis中保存着一张映射表

该表中记录着各个动态文件所对应的后缀名

以及对应的可以处理该动态文件的程序集

比如:aspx和ashx对应的为aspnet_isapi.dll

iis通过这个起着桥梁作用的程序集与.net framework相连

将iis不能处理的动态文件交给framework处理

在framework中经过一系列的处理装载生成了对应的页面

在通过桥梁返回给iis,之后再返回给浏览器

这就是简单的asp.net生命周期过程

如下图(asp.net请求管道第一版):


详细的asp.net页面生命周期:

浏览器发送请求到iis

iis无法处理动态页面

交给 映射表中对应的扩展程序集

 将请求发给 Framework 

调用HttpRuntime.ProcessRequest()方法开始整个asp.net生命周期(  HttpRuntime中有一个指向扩展程序的指针用来接受和发送报文 )

这时会先创建一个HttpWorkRequest对象,里面存放着请求的原始报文数据 

根据 HttpWorkRequest对象创建一个HttpContext对象存放处理过的报文信息以供给程序员使用,全都封装在
context对象中的Request属性中,如Request.Form,而Response属性中将会储存生成的响应报文的数据(这里有没有觉得很熟悉,我们经常会使用到的方法和属性就是这里来的)
 在这之后会通过HttpApplicationFactory 创建一个 HttpApplication然后调用ProcessRequest方法来处理整个请求(这里也会用到HttpContext上下文封装的请求信息)

在该pr方法中按照执行顺序的19个事件的过程组成了一个请求管道(这个pr方法其实就是执行一系列的事件)

其中第八个事件时创建被请求的页面类对象并转成IHttpHandler接口(对这个接口有没有很熟悉)

在11与12个事件之间执行页面类对象的ProcessRequest方法

在这里,ashx的pr方法是直接提供给程序员写的,所以里面只是一些简单的代码

而aspx的pr方法中,还调用了BuildControlTree()生成页面空间树,之后调用Rend方法根据空间树生成html代码

这就是为ashx响应速度会比aspx快,因为ashx的pr方法很简洁

所有事件执行完毕
之后,会有一个FinishRequest方法结束请求管道

在通过HttpWorkRequest 将生成的html代码返回给扩展程序

交给iis

返回给浏览器

详情如下图:


借助反编译攻击Reflector我们可以看到生命周期的整个过程

记录的不怎么清楚,自己的理解也表达不清楚

希望大侠给予指导

posted @ 2014-07-07 23:09  蒋源德  阅读(257)  评论(0编辑  收藏  举报