当用户起一个请求到服务器,服务器接收到请求并将该页面返回给浏览器。
这一个看似简单的过程中间到底经历了什么?
我们可以称这一过程为页面的生命周期,即,一个页面从开始被请求到请求结束销毁的过程
而这其中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我们可以看到生命周期的整个过程
记录的不怎么清楚,自己的理解也表达不清楚
希望大侠给予指导