浅谈ASP.NET内部机制(三)

来源:互联网 发布:直播盒子源码 编辑:程序博客网 时间:2024/06/06 14:08
前言:在用ASP.NET开发网站的时候,常常看到"生命周期"周期整个词,在ASP.NET AJAX客户端开发时,也有生命周期的概念。觉得微软很喜欢引入生命周期。其实生命周期还是蛮好的,可以使得我们对程序运行的每个过程都可以掌控,提供更加灵活的开发。如果被生命周期弄糊涂了就不好了...
 
      本系列的文章中很少涉及代码,希望大家见谅!
      我这里也不想罗列MSDN上的东西。而是想尽量的把相应的知识说的更加通俗。简单的说来,再ASP.NET运行的时候一般会有两个比较明显的生命周期。一个发生再Http管道的生命周期,另外一个就是我们常说的页面的生命周期。生命周期说白了就是处理的流程。


      下面我们就来分别的介绍这两个生命周期。
      Http管道中的生命周期(将其中重要的讲解下)。
 其实所谓的http管道简单的说其实就是加载相应的httpmodule和httphandler的过程。应该还记得我们之前的那幅图。如下:

     
     

 

      当一个请求被ASP.NET     运行时开始处理的时候,http管道就开始加载很多的httpmodule(http模块)和处理相应资源的httphandler(http处理程序)。我们就从一个请求被处理的流程来说起(是按照被处理的先后顺序来说的)。


      首先,当一个请求来了以后,ASP.NET运行时就要开始处理这个请求。大家应该还知道,再一个ASP.NET程序来开始运行的时候,应用程序域(Domain)中会初始化一个HttpApplication类的实例来主导整个程序的运行,通俗的说就是用一个对象来控制整个程序的运行流程。请求来了,HttpApplication类的实例(以后简称Application)就触发BeginRequest事件(请求开始)来开始处理请求。从这点意义来说,我们其实可以把http管道生命周期这个过程看成是Application处理一个请求的时候触发相应事件的过程。而且Application的事情的触发是自动的,而且我们也可以注册这些事件,以便在相应的时候执行我们的代码。比如在这个事件中,因为请求刚刚开始,其实我们可以注册这个事件来执行url的重写,来把请求的url重新定位。比如我们原来请求http://www.cnblogs.com/yanyangtian,但是在网站的服务器中,没有yanyangtian这个文件夹或者文件,其实这就是url重写的例子,其实就是在这个BeginRequest中把url换成了http://www.cnblogs.com/index.aspx?name=yanyantian.


      接下来就是开始了一些验证方面的处理,因为一个请求进来了以后,会带来一些额外的信息。这些信息都保存在相应的HTTP Header中。一个请求通常是要求查看相应的页面或者文件,所以我们来保存这个请求有足够的权限来查看文件或者页

面,所以这时候就触发Application的AuthenticateRequest事件,而且来会调用相应的模块了处理,如我们熟悉的Windows验证模块和Forms验证模块。大家应该还记得我们之前的文章中有提过:asp.net_filter把url中的cookieless信息转换为相应的Http Header,以便以后验证。此时,就会用到之前的那些cookieless中的信息来验证了。而且我们也可以在这里做一些自己的控制,如原来请求的cookie中传入的用户明是xiaoyang,我们其实在这里可以改为其他的用户名。其实有关验证(安全方面)话题很大,我之后会有另外的系列文章来专门讲述的。


      再接下来就是触发PostAuthenticateRequest事件,之前是验证,现在实际上是验证已经完了,而且此时我们对验证中的一些信息再也不能改变,比如之前验证的(如Forms),我们把用户名保存在了FormsIdentity的Name属性中,此时我不能再改变Name属性了。其实在这里就是设置验证的状态,验证通过就设置StatusCode=200,否则失败,然后请求就结束了。


      接下来就是开始了授权方面的操作,触发AuthorizeRquest.通过验证,并不说明我们的请求就可以访问相应的页面或者文件。打个比方,我们可以通过通行证去参加一个会议,但是我们不能去主席台就坐,因为我们的通行证的权限有限。我们的通行证仅仅只是让我们可以进入会场而已。同验证过程一样,我们也可以在这里执行一些自己的代码,比如我们可以冒充别的用户,用他们的权限来做一些事情。


      接下来就是PostAuthorizeRequest,授权处理在这里完成了,我们就可以知道:到底允不允许一个请求查看一个文件或者页面。


      接下来就是就执行一些请求的缓存以及session的一些保存更新的操作。而这些过程我们一般不是很关注。我们的请求在上述的处理过程中被一个模块传给另外的一个模块,在它们之间传递着。不管我们请求的是什么,是图片,是音频,还是别的文件,最后请求终究还是要被处理的。而这个处理的的是在Application的PreRequestHandlerExecute事件(预请求处理,也就是将要请求处理之前)中决定的。因为在ASP.NET的配置文件中,就已经注册了很多相应文件的处理程序,常见的就是.aspx文件是由Page(实现了IHttpHandler接口)处理的。在这个事件中实际上就可以是认为在配置查找:请求的文件是否有相应的处理程序程序,如果有,就加载这个处理程序。假如我们之前请求的是default.aspx,那么就决定由Page来处理这个请求。然后就进入了页面的生命周期。


      当页面生命周期完成之后,Application继续触发一些事件,直到EndRequest。


      综上,可以看出,页面生命周期是包含在Http管道的生命周期之中的。

     我们用下面的图总结:


  

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 绝地求生买的钥匙激活码丢了怎么办 蓝河奶粉宝宝吃了不长肉怎么办 苹果ios版本太低激活不了怎么办 脸上被油烫伤了 起了水泡怎么办 皮肤被油烫伤起来个水泡怎么办 去泰国旅游没来得及兑换泰铢怎么办 游戏和安卓 不和 出现黑屏怎么办 邻居把垃圾放在楼梯口不丢怎么办 58热敏小票打印机口松了怎么办 王鹏的眼睛今天起疙瘩了怎么办 背包带子老从肩膀滑下来怎么办 绝地求生用手机流量更新不成怎么办 手机拍的视频在电脑上放不了怎么办 炉石传说手机点登陆游戏闪退怎么办 车到信号屏蔽区一键启动不了怎么办 王者荣耀战队活跃度满了怎么办 win10你的账户已被停用怎么办 电脑一键还原后一直黑屏怎么办? 被打了狂犬疫苗的狗咬伤怎么办 美版苹果7系统坏了怎么办 韩服的球球大作战网络不稳定怎么办 球球大作战号删了找不回来怎么办 队友传足球球的时候接不到怎么办 魅族手机中病毒锁机了怎么办? vbs打开是和文本文档一样怎么办 把电脑注册表删了电脑动不了怎么办 注册表删一项后电脑启动不了怎么办 解压过的过的软件安装包损坏怎么办 手机中病毒自动发短信扣费怎么办 苹果手机中的高德地图打不开怎么办 大晚上挂了别人的车怎么办 手机不兼容高版本微信怎么办 绝地求生右下角小地图变大了怎么办 杯孕当月做了C丁怎么办 玩全军出击手机发烫就出现卡怎么办 不小心买了彩虹六号肝帝版本怎么办 微信游戏刺激战场电脑卡怎么办 电脑更新了以前的东西都没了怎么办 安装黑苹果鼠标键盘不能用怎么办 苹果开机卡在白底黑苹果怎么办 信长之野望14没有剧情触发怎么办