前言:在用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管道的生命周期之中的。
我们用下面的图总结:
有关页面的生命周期,下次说。今天就到这里,理论很多,大家见谅!