ASP.NET应用程序生命周期

  没事的时候看看别人的文章,总结了一点小东西,不一定非常全面,希望各位看完能给个参考意见,我会随时更改,谢谢各位大牛的参予!!!

  先给大家看个图片。

首先是客户端将用户的操作封装成Http请求报文string通过socket发送给服务器,是服务器上的HTTP.SYS服务来接收,并解析当前请求地址端口等然后将当前的请求交给IIS来处理。

然后w3svc会根据请求交给aspnet_isapi.dll来处理当前请求的内容(检查当前请求的扩展名,确定应由哪个 ISAPI 扩展处理该请求,然后将该请求传递给合适的 ISAPI 扩展。ASP.NET 处理已映射到其上的文件扩展名,如 .aspx、.ascx、.ashx 和 .asmx。这里需要注意了:如果文件扩展名尚未映射到 ASP.NET,则 ASP.NET 将不会接收该请求。如果想要处理.html的页面,需要将.html映射到IIs中

将当前请求交给ISAPIRuntime来处理,并执行ISAPIRuntime.ProcessRequest()方法,ISAPIRuntime.PR()方法内部通过ECB指针,初始化一个HttpRequest对象,ECB指针不会释放,直到结束也是通过ECB指针来返回数据。

然后将上面初始化的HttpRequest对象传给HttpRunTime.PR()方法里,通过HttpRequest对象来创建一个HttpContext上下文,然后判断是否是第一次请求,如果是会先读取Global文件,执行Application_Start()方法,方法中通过ApplicationFactory来获取Application对象,ApplicationFactory会先去查看ApplicationPool中是否存在Application对象,如果有直接返回一个实例,没有则重新创建一个返回,并把所有的HttpModule初始化,调用所有的HttpModule的Init方法;其中UrlRouteHttpmodule中的Init方法注册了管道中的第七个事件响应方法,方法内部指定了MvcHandler(通过配置文件来配置UrlRouteHttpmodule,通过路由规则返回具体的Handler)。

接下来就是应用程序生命周期中的管道。。。。。。。。。。。。

管道中微软公布的有23个步骤,19个事件。

其中第七个事件获取缓存,第八个事件是已经映射,处理当前请求的HttpHandler,在第七和第八个事件中间来判断是否指定了MvcHandler,如果指定了,直接通过,向下执行,如果没有通过则根据当前请求地址创建出来一个IHttpHandler实例。

十一和十二个事件之间则是非常重要的一部分,其中会判断当前请求,如果是一般处理程序,直接执行程序员写的代码,如果是MVC,执行MvcHandler.PR(),如果是WebForm,执行页面生命周期;

下面介绍一下MvcHandler.PR()和页面生命周期;

MvcHandler.PR():

MvcHandler.PR()中由控制器(Controller)响应的方法接收请求,执行程序员写的代码,处理用户的请求,向业务逻辑层索取数据,业务逻辑层接收并处理控制器发来的请求,并通过数据访问层来获取控制器需求的数据,将数据返回给MVC中的模型(Model)中,控制器通过视图(View)将需要展示的内容返回给IIS;

页面生命周期:

1.创建页面控件树,把整个文档生成一个树状的结构,如果是静态的文本就直接生成Literal。如果是服务器端框架,那么就在树上生成一个控件的对象。

2.确定IsPostBack属性,根据请求报文是否包含__ViewState设置IsPostBack属性,根据是否包含__VIEwstate设置IsPostBack的属性,requestValueCollection先判断有没有请求数据,如果没有IsPostBack肯定是false。

3.初始化阶段,PriInit  预初始化 ,Init  初始化  InitComplete初始化完成。

4.如果是回发加载ViewState,解析ViewState,将能放到控件树上的内容放上去,然后把改变了控件被点击的控件收集到一个集合里面。

5.加载阶段,Page_load之前为页面做一些最后的准备工作,然后递归调用母版页控件  用户控件所有的Page_load方法。

6.第二次处理回发数据,,第二次调用PostData()方法处理回发数据,处理在PageLoad里面动态创建的控件的事件。

7.LoadComplete加载完成。

8.PreRender预渲染。

9.SaveAllState保存页面状态,此时还没有生成隐藏域, 将控件里面发生改变的状态保存在页面对象的VIewstate属性中,前面的事件有可能修改控件的状态属性,将控件的最后属性及用户定义的最后值放到ViewState(生成隐藏域),保存页面状态,保存页面状态后就不允许再对页面控件改动了。

10.渲染 Render把服务器控件生成html标签的过程。

11.卸载,页面生命周期完成,继续往下走。

 

注意:整个应用程序生命周期中Global文件是核心文件,其中注册了管道中的事件,可以由程序员灵活的配置。

大概的流程就理解这么多,请不要吝啬您的宝贵意见。让我们共同成长!谢谢!

 

 

 

posted on 2013-07-27 20:33  徐荣权  阅读(230)  评论(3编辑  收藏  举报