asp.net的页面执行过程讲解

来源:互联网 发布:sketch中文版破解mac 编辑:程序博客网 时间:2024/05/22 06:40

 

首先先重温一下关于b/s模式的整个请求过程:
客户端通过在浏览器的地址栏敲入地址来发送请求到服务器端  ->  服务器接收到请求之后,发给相应的服务器端页面(也就是脚本)来执行,脚本产生客户端的响应,发送回客户端   ->  客户端浏览器接收到服务器传回的响应,对Html进行解析,将图形化的网页呈现在用户面前
这个模式不管是asp,php,还是jsp,asp.net都适合.好了下边谈谈关于客户端与服务器的交互方式:
1:Form:这是最主要的方式,标准化的控件来获取用户的输入,Form的提交将数据发送给服务器端处理
2:QueryString:通过在Url后面带参数达到将参数传送给服务器,这种方式其实跟Get方式的Form是一样的
3:Cookies:这是一种比较特殊的方式,通常用于用户身份的确认
这些知识重温以后,该谈谈我们这次的主题了,关于asp.net中的页面执行过程分析:
首先谈谈关于asp和jsp,php这些传统的web语言,因为我对后两个不是很懂,对asp也是只知道皮毛(我开始学习程序设计时,asp.net已经如火如荼了)  ,所以这个只能拷网上的东西了
下边这段是我从网上找来的:
传统的服务器脚本语言,如ASP、JSP等,编写服务器脚本的方式大同小异,都是在Html中嵌入解释或编译执行的代码,由服务器平台执行这些代码来生成Html;对于这类似的脚本,页面的生存周期实际上很简单,就是从开头至末尾,执行完所有的代码,当然用Java编写的Servlet可以编写更复杂的代码,但是从结构上看,和JSP没什么区别。
对于asp.net, 采用了"代码后置"(CodeBehind)技术,并引进了服务器端控件,并加入了服务器端事件的概念,改变了传统的教本语言编写方式,  但是他本身没有改变web编程的模式,只是封装了一些细节、提供了一些易用的功能,使代码更容易编写和维护;从某种程度上来说,将服务器端执行的方式复杂化了
下边具体谈谈asp.net一次页面执行的整个周期.
asp.net的编程模式仍然是传统的处理方式:提交请求 -> 接受请求 -> 处理请求 -> 放松响应. 下边这句话一定要记住:  每一次与客户端的交互都会引发一次新的请求,所以一个Web Page的生命周期是以一次请求为基础的。这句话是些asp.net的程序中一定要牢记的,一次的页面执行是以一次请求为基准的,通俗的说就是一次页面的刷新,
我这些天听到的最多的一句话是:程序绝对不是代码的堆积 .  所以概念的清楚比一个语法的清楚要总要的多,这个不仅仅使用与软件,其他的同样道理,神永远都大与形的.这个是一个好朋友的 名言  ,大家也共同感悟名言吧^_^

下边这段话是从msdn上看到的,讲解的是在程序的底层如何处理一次请求:
当IIS收到客户端的请求的时候,会将请求交给aspnet_wp这个进程来处理,这个进程会查看请求的应用程序域是否存在,如果不存在则会创建一个,然后会创建一个Http运行时(HttpRuntime)来处理请求,这个运行时“为当前应用程序提供一组ASP.NET 运行时服务” HttpRuntime在处理请求的时候,会维护一系列的应用程序实例,也就是应用程序的Global类(global.asax)的实例,这些实例在没有请求的时候,会存放在一个应用程序池中(实际上应用程序池由另一个类来维护,HttpRuntime只是简单的调用),每接收到一个请求,HttpRuntime都会获取一个闲置的实例来处理请求,这个实例在请求结束前不会处理其他的请求,处理完毕之后,它又会回到池中,“一个实例在其生存期内被用于处理多个请求,但它一次只能处理一个请求。”
所以在调试asp.net的程序时,在任务管理器里边有aspnet_wp这个进程,而且我们在研究我们的代码质量时,也往往就是用的这个进程.
当应用程序实例处理请求的时候,它会创建请求页面类的实例,执行它的ProcessRequest方法来处理请求,这个方法也就是Web Page生命周期的开始。
接下来分析页面执行的每一个时期发生的事情
1、 初始化
初始化对应Page的Init事件和OnInit方法。如果要重写,MSDN推荐的方式是重载OnInti方法,而不是增加一个Init事件的代理,这两者是有差别的,前者可以控制调用父类OnInit方法的顺序,而后者只能在父类的OnInit后执行(实际上是在OnInit里面被调用的)。
2、 加载视图状态
这是个比较重要的方法,我们知道,对于每次请求,实际上是由不同的页面类实例来处理的,为了保证两次请求间的状态,ASP.Net使用了ViewState, LoadViewState方法就是从ViewState中获取上一次的状态,并依照页面的控件树的结构,用递归来遍历整个树,将对应的状态恢复到每一个控件上。
3、 处理回发数据
这个方法是用来检查客户端发回的控件数据的状态是否发生了改变。方法的原型:
public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
postDataKey是标识控件的关键字(也就是postCollection中的Key),postCollection是包含回发数据的集合,我们可以重写这个方法,然后检查回发的数据是否发生了变化,如果是则返回一个True,“如果控件状态因回发而更改,则LoadPostData 返回 true;否则返回 false。页框架跟踪所有返回 true 的控件并在这些控件上调用RaisePostDataChangedEvent。”(摘自MSDN)这个方法是System.Web.WebControls.Control中定义的,也是所有需要处理事件的自定义控件需要处理的方法,对于我们今天讨论的Page来说,可以不用管它。
4、 加载
加载对应Load事件和OnLoad方法,对于这个事件,相信大多数朋友都会比较熟悉,用VS.Net生成的页面中的Page_Load方法就是响应Load事件的方法,对于每一次请求,Load事件都会触发,Page_Load方法也就会执行,相信这也是大多数人了解ASP.Net的第一步。
5、 发送回发更改通知
这个方法对应第3步的处理回发数据,如果处理回发数据返回True,页面框架就会调用此方法来触发数据更改的事件,所以自定义控件的回发数据更改事件需要在此方法中触发。同样这个方法对于Page来说,没有太大的用处,你也可以在Page的基础上自己定义数据更改的事件
6、 处理回发事件
这个方法是大多数服务器控件事件引发的地方,当请求中包含控件事件触发的信息时
,页面控件会调用相应控件的RaisePostBackEvent方法来引发服务器端的事件。
原创粉丝点击