一、服务器脚本基础介绍
首先,我们先复习一下web服务器页面的基本执行方式:
1、 客户端通过在浏览器的地址栏敲入地址来发送请求到服务器端
2、 服务器接收到请求之后,发给相应的服务器端页面(也就是脚本)来执行,脚本产生客户端的响应,发送回客户端
3、 客户端浏览器接收到服务器传回的响应,对html进行解析,将图形化的网页呈现在用户面前
对于服务器和客户端的交互,通常通过下面几种主要方式:
1、 form:这是最主要的方式,标准化的控件来获取用户的输入,form的提交将数据发送给服务器端处理
2、 querystring:通过在url后面带参数达到将参数传送给服务器,这种方式其实跟get方式的form是一样的
3、 cookies:这是一种比较特殊的方式,通常用于用户身份的确认
二、asp.net简介
传统的服务器脚本语言,如asp、jsp等,编写服务器脚本的方式大同小异,都是在html中嵌入解释或编译执行的代码,由服务器平台执行这些代码来生成html;对于这类似的脚本,页面的生存周期实际上很简单,就是从开头至末尾,执行完所有的代码,当然用java编写的servlet可以编写更复杂的代码,但是从结构上看,和jsp没什么区别。
asp.net的出现,打破了这种传统;asp.net采用了codebehind技术和服务器端控件,加入了服务器端的事件的概念,改变了脚本语言编写的模式,更加贴近window编程,使web编程更加简单、直观;但是我们要看到,asp.net本身并没有改变web编程的基本模式,只是封装了一些细节、提供了一些易用的功能,使代码更容易编写和维护;从某种程度上来说,将服务器端执行的方式复杂化了,这就是我们今天要讨论的主体:asp.net
web page的生存周期。
三、asp.net请求处理模式
我们说,asp.net的web page并没有脱离web编程的模式,所以它仍然是以 请求->接收请求->处理请求->发送响应
这样的模式在工作,每一次与客户端的交互都会引发一次新的请求,所以一个web page的生命周期是以一次请求为基础的。
当iis收到客户端的请求的时候,会将请求交给aspnet_wp这个进程来处理,这个进程会查看请求的应用程序域是否存在,如果不存在则会创建一个,然后会创建一个http运行时(httpruntime)来处理请求,这个运行时“为当前应用程序提供一组
asp.net 运行时服务”(摘自msdn)。
httpruntime在处理请求的时候,会维护一系列的应用程序实例,也就是应用程序的global类(global.asax)的实例,这些实例在没有请求的时候,会存放在一个应用程序池中(实际上应用程序池由另一个类来维护,httpruntime只是简单的调用),每接收到一个请求,httpruntime都会获取一个闲置的实例来处理请求,这个实例在请求结束前不会处理其他的请求,处理完毕之后,它又会回到池中,“一个实例在其生存期内被用于处理多个请求,但它一次只能处理一个请求。”(摘自msdn)
当应用程序实例处理请求的时候,它会创建请求页面类的实例,执行它的processrequest方法来处理请求,这个方法也就是web
page生命周期的开始。
四、aspx页面与codebehind
在深入了解页面的生命周期之前,我们先来探讨一些aspx与codebehind之间的关系。
<%@ page language="c#" codebehind="webform.aspx.cs"
inherits="mynamespace.webform" %>
相信使用过codebehind技术的朋友,对aspx顶部的这句话应该是非常熟悉了,我们来一项一项的分析它:
page language="c#" 这个就不用多说了吧
codebehind="webform.aspx.cs" 这一句表示绑定的代码文件
inherits="mynamespace.webform"
这句非常重要,它表示页面继承的类名称,也就是codebehind的代码文件中的类,这个类必须从system.web.webcontrols.page派生