asp.net的生命周期,简单总结

只是简单的想哪写哪,并不细

浏览器和服务器的交互的过程
1浏览器发出请求
如果是HTML文件,直接返回(这里网上见过一种技术,不浪费IIS性能,把静态页交给别的工具处理)
如果是ASPX文件,IIS调用解析程序(名字忘了,其他后缀的文件类似,IIS直接派给A,A把处理的结果给IIS,IIS再给浏览器)

另外:HTTP协议,走的是TCP/IP,三握手,点对点的。HTTP1.0 HTTP1.1 区别百度。

现在主要都是HTTP1.1。曾碰上过一个这样的面试题。只答出HTTP1.0一次请求后就释放,HTTP1.1是长链接,还保持一段时间。……答不出来很纠结,之前了接触过,但没有了解细节。更纠结的是听外面公司的人在讨论这题,他们的回答内容是HTTP1.1是三握手……错的比我还离谱,把HTTP1.1和TCP/IP搞混了。

个人觉得最主要的区别是这一条。
HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。例如:一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。

 

而ASPX页面的处理是要经过一个管道的过程。不论是asp.MVC还是asp.WebForm。其实J2EE也是一样,也有一个管道的过程。

(个人对J2EE的了解并不深,只是自学过一部分,因为没有相关的工作经验,了解有限,只是互相对比着能加深一定的理解,若有说错的地方,见谅。)

httpmoudle,从J2EE的角度httpmoude,被叫作过滤器,httpmoude是一个特殊的servlet,J2EE最常见的过滤器,是字符集转换。 有兴趣的请搜索j2ee 过滤器。

 

httpmoudle 类要实现IHttpModule接口,有许多的事件委托。

httpmoudle会在”拦截“处理所有的请求,不同的httpmoudle实现同样的事件,事件的处理顺序是web.config中定义的顺序。

这些事件,要注意的地方有。

session是在某个事件时实现的,在这个事件实现前调用会出错。这种需要再查吧。

 

httpmoudle中有httphandle处理之后的事件。

httphandler是要以定义”拦截“哪些页面的请求的。并不是直接交给httphandle处理,而是提交实现了IHttpHandlerFactory接口的类的实例(实例要在web.config中注册),该实例反回一个httphandler对象,处理请求。

 

过程简单为,httphandler处理前httpmoudle要处理的事件,httphandler,httphandler处理后httpmoudle要处理的事件

 

aspx后台,CS类继承了System.Web.UI.Page类,该类实现了Ihttphandler接口。

 

但asp.net页面,有自已的生命周期。

 

1Page_Init,页面初始化。这有一点补充。Page_Init 事件里添加的控件是不在编译完的代码里的。

 

//之下两步是实现webform事件的前提。

//什么情况会触发事件?不管是什么变了,总归是控件的某个属性变了,触发相应的事件对吧?

//但程序怎么知道控件的哪个属性改变了以调用不同的事件去处理?

//当然要比较了,比较才知道有没有变对吧,那是谁和谁比较?

//前和后,当前状态和改变后的状态。这些状态在哪里?

//前的状态在哪里?ViewState,所有控件的状态都在这里保存(除非禁用ViewState)

//ViewState的的数据哪里来,我们都知道ViewState实质上是input hidden表单对象,也是要提交到后台的(,这也就是很多人诟病的ViewState占用传输空间时间问题。要回传控件的状态)

//后的状态呢?当然也是在表单里。实际上,要比较的,前和后的状态都在表单里。

//所以下面两部的作用就很明确了。

2LoadViewState:

这个是得到视图上控件的ViewState信息,从回发的ViewState取得,比如一个checkbox ViewState选择项是a(第一次进页面当然为空了,Ps:runat=server 也有VIEWSTATE)

3LoadPostDate:

得到回传的信息,其实就是表单里非ViewState的信息,这点很重要,也许很多人用过,比如checkbox的autopostback,回传后遍历所有的服务器控件,看值是否改变(每个控件都有一个是否改变的标志位),如果改变了,则修改标志位。再修改控件的属性

PS:当然要修改了,不然的话,很多人在后台事件里,得到当前的属性值,如果不修改,得到的不还是旧的?

4Page_Load,最常见的一个事件了,加载控件树,加载完才能像this.controls.什么的把控件点出来,才可能得到一个控件的父控件,其实在这里就能点出最新的控件的属性,显然是根据上一步修改后的。这里可以修改控件的值

5RaisePostDataChange事件,这个我个人理解是得到之前修改过标志位的控件,并得到是哪个属性被改变,要执行哪个方法。

6RaisePostBackEvent,个人理解是遍历那些改变过的控件,若有对应的事件方法,则执行,无则继续下一个控件,这个事件里可以改变控件的属性,webform的主要实现都是在这个事件中实现。可以改变控件的值。

7Page_PerRender,预呈现,可以改变控件的值,这之后就没法修改了。

 

8SaveViewState把现在修改后的控件的值,写入VIEWState,写入的目的是为了下一次回发时判断是否修改,现在的新状态,便是下一次的旧状态。

9Page_Render呈现HTML

10UnLoad 销毁对象。

 

 

posted @ 2013-06-11 22:35  cclient  阅读(321)  评论(0编辑  收藏  举报