浅谈ASP.NET内部机制(四)
前言:在用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文件是由Page(实 现了IHttpHandler接口)处理的。在这个事件中实际上就可以是认为在配置查找:请求的文件是否有相应 的处理程序程序,如果有,就加载这个处理程序。假如我们之前请求的是default.aspx,那么就决定由 Page来处理这个请求。然后就进入了页面的生命周期。 当页面生命周期完成之后,Application继续触发一些事件,直到EndRequest。 综上,可以看出,页面生命周期是包含在Http管道的生命周期之中的。 有关页面的生命周期,下次说。今天就到这里,理论很多,大家见谅! |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |