当前位置: 首页 > 图文教程 > .Net技术 > ASP.NET > 浅谈ASP.NET内部机制

ASP.NET
VS2008SP1下jQuery使用初体验
使用asp.net 2.0中的SqlBulkCopy类批量复制数据
asp.net定点执行任务总结
通过webBrowser 来轻松模拟网页来源
ASP.NET框架 数据回发与事件回发
浅谈ASP.NET内部机制
通用语言规范
GC垃圾回收
ASP.NET 配置
ASP.NET 安全认证
ASP.NET生成复合控件
asp.net中forms验证
DataTable中数据记录的统计
关于无aspx文件部署,我的一些探索心得
ASP.NET刷新页面的六种方法
ASP.NET MVC应用程序的本地化、单元测试
详解ASP.NET的四种状态
.NET与Java间进行Web Service交互的选择
自己动手实现Asp.net的MVC框架
ASP.net中网站访问量统计方法

浅谈ASP.NET内部机制


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 76 ::
收藏到网摘: n/a

在用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的Mame属性中,此时我不能再改变Name属性了。其实在这里就是设置验证的状态,验证通过就设置StatusCode=200,否则失败,然后请求就结束了。


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


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


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


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


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