ASP.NET状态管理

来源:互联网 发布:java service生命周期 编辑:程序博客网 时间:2024/05/10 12:08

     突然发现被公司项目组PM面试时,他们总是喜欢问ASP.NET状态管理的问题,自己回答的也是不很清楚,所以在博客园找到了一篇文章感觉很好,转来了。原文链接:http://www.cnblogs.com/xieex/archive/2007/11/28/975480.html

 

     第一部分:页面状态介绍
Http协议————“无状态协议”
Web服务器每分钟对上千个用户进行管理的一种方式就是执行所谓的“无状态”链接。只要有一个希望浏览器返回一个页面、图像或其他资源的请求,就发生以下事情:
1、连接到服务器
2、告诉服务器想要的页面、图像或者其他项
3、服务器发送请求的资源
4、服务器切断连接,把用户忘的干干净净。
也就是页面之间在Http协议下是没有任何关系的,这样就需要有状态管理来传输页面之间的数据。


WEB页面处理过程
1、页面的一次往返处理:用户对服务器控件的一次操作,就可能引起页面的一次往返处理:页面被提交到服务器端,执行响应的事件处理代码,重建页面,然后返回到客户端。
2、页面重建:每一次页面被请求,或者页面事件被提交到服务器,ASP.NET运行环境将执行必要的代码,重建整个页面,把结果页面送到浏览器,然后抛弃页面的变量、控件的状态和属性等等页面信息。
3、页面处理内部过程:
(1)、Page_Load:IsPostBack属性判定页面是否为第一次被请求。
(2)、事件处理:这一阶段处理表单的事件
(3)、Page_Unload:这个阶段页面已经处理完毕,需要做些清理工作,一般地,你可以在这个阶段关闭打开文件和数据库链路,或者释放对象。

ASP.NET Web Form框架的“连续”和“有状态”假象
访问者打开页面的连续画面,这实际上一种假象,这种假象是由ASP.NET页框架、页及其控件实现的。


第二部分:基于客户端的状态管理:
状态信息放在客户端上。
一、视图状态(ASP.NET特有)
二、隐藏的窗体域
三、Cookie
四、查询字符串

ASP.NET服务器控件的生命周期:
1、初始化——Init事件(OnInit方法)
2、加载视图状态——LoadViewState方法(当页面回发时,首先从_ViewSatae字段信息中加载该控件的状态
3、处理回发数据——LoadPostData方法
4、加载——Load事件(OnLoad方法)
5、发送回发更改通知——RaisePostDataChangedEvent方法
6、处理回发事件——RaisePostBackEvent方法
7、预呈现——PreRender事件(OnPreRender方法)
8、保存视图状态——SaveViewState方法
9、呈现——Render方法
10、处置——Dispose方法
11、卸载——UnLoad事件(OnUnLoad方法)

第三部分 基于服务器的状态管理
信息存储在服务器上,尽管其安全型较高,但会占用较多的web服务器资源。服务器端通常用以下方式实现状态管理:
一、Application对象
二、Session对象

    一、Application状态
1、应用程序级别的状态存取(就是说服务器上的应用程序,各个客户端都可以访问它)
2、变量状态的存储和提取
存储: Application["username"] = "xieex";
提取: string strUserName = Application["username"];
3、同时访问要加锁,防止并发冲突
Application.Lock();
Application.Unlock();
Application是保存在服务器内存中的。

  

    二、Session状态
对网站的一次访问叫做会话(Session),超时后,自动结束会话(一般是20分钟),Session也是保存在服务器内存中的。
使用Session时的情况,如:
1、购物车:网络用户决定购买的商品列表
2、用户信息:访问者的姓名
3、用户设置:个性化界面
等等

ASP.NET会话状态模块在Web.config文件中像这样配置(不进行额外设置,以下是默认设置)的:
<sessionState mode="InProc" cookieless="false" timeout="20" />
mode属性设为InProc(默认值),表明会话状态要由ASP.NET存储在内存中
cookieless属性设为false,表明不用Cookie来传递会话ID,这就避免了用户禁用了Cookie,Session对象无数据可用。
timeout属性设为20,表示登录网站后,如果20分钟不对其进行操作,则该会话结束,需要重新登录。

Session属性和方法:
1、TimeOut属性:
获取和设置会话结束之前的时间段,以分钟为单位,默认为20分钟
2、Abandon():
结束当前会话,会话中的所有信息都被清空
3、Clear():
删除当前会话中的所有信息,但不结束会话
4、IsNewSession:
如果会话是在用户访问页面时创建的,则这个属性返回true,当会话需要对某些数据进行初始化后才能使用时,就可以使用这个属性。

Application和Session状态的区别:
简单的说,Application是应用程序级别的状态存储,Session是会话级别的状态存储。
另外作用域不同,
Application对象针对所有用户都生效
Session对象则相反,每个用户都有自己的Session对象,它的生命周期起始于服务器产生对用户请求页面的响应,终止于用户断开与服务器的连接。
举例来说,当手机开机时,相当于一个Applicaion开始,然后当一个朋友打电话过来,此时一个Session开始,挂电话时相当于这个Session结束,然后又有一个朋友打电话过来,此时另一个Session开始。手机未关机说明Application还未结束
由于Application和Session状态都存储在内存中,但是当服务器重新启动时,保留的状态就会消失了,为了保留其状态,就必须将状态保存到数据库。如网站计数器

最后对各个状态进行总结:
为了更清楚的了解,我们总结出每一种对象应用的具体环境,如下表所示:

方法

信息量大小

保存时间

应用范围

保存位置

Application

任意大小

整个应用程序的生命期

所有用户

服务器端

Session

小量,简单的数据

用户活动时间+一段延迟时间(一般
为20分钟)

单个用户

服务器端

Cookie

小量,简单的数据

可以根据需要设定

单个用户

客户端

Viewstate

小量,简单的数据

一个Web页面的生命期

单个用户

客户端

Cache

任意大小

可以根据需要设定

所有用户

服务器端

隐藏域

小量,简单的数据

一个Web页面的生命期

单个用户

客户端

查询字符串

小量,简单的数据

直到下次页面跳转请求

单个用户

客户端

Web.Config文件

不变或极少改变的小量数据

直到配置文件被更新

单个用户

服务器端


 

原创粉丝点击