首页 > 代码库 > ASP.NET Web – 状态管理

ASP.NET Web – 状态管理

 

状态类型 客户端或服务器资源 有效时间
ViewState 客户端 只在一个页面中
Cookie 客户端 关闭浏览器时会删除临时cookie,永久cookie存储在客户系统的磁盘上
Session 服务器 会话状态与浏览器相关。会话在超时(默认为20分钟)后变得无效
Application 服务器 在所有的客户端上共享应用程序状态,这个状态在服务器重新启动之前都是有效的
Cache 服务器 类似于应用程序状态,缓存是共享的。但是,使缓存无效有更好的控制方式

客户端的状态管理

-ViewState

Web服务器控件自动使用ViewState来使事件工作。ViewState包含的状态与控件发送给客户端时包含的状态相同。当浏览器把窗体发送回服务器时,ViewState包含了初始值,但所发送的控件包含新值。如果初始值和新值有区别,就调用相应的事件处理程序。

缺点:数据总是要从服务器传送给客户端,再从客户端传送给服务器,增加了网络流量。在Page指令中把EnableViewState属性设置为false,就可以关闭页面中有控件的ViewState。

还可以把定制的数据存储在ViewState中。为此可以使用索引符和Page类的ViewState属性。ViewState[“mydata”] = “my data”;

优点:每个浏览器都可以使用这个特性,用户不能关闭它。

ViewState只保存在页面中。如果状态应保存在多个不同的页面中,就应使用cookie在客户端保存状态。

-cookies

在HTTP头中定义。使用HttpResponse类可以把cookie发送给客户端。Response是Page类的一个属性,它返回一个HttpResponse类型的对象。此类定义了返回HttpCookieCollection的Cookies属性。使用HttpCookieCollection可以向客户端返回多个cookie。

以下代码说明了如何把cookie发送给客户端

string myval = “myval”;

HttpCookie cookie = new HttpCookie(“mycookie”)

cookie.Values.Add(“mystate”, myval)

Response.Cookies.Add(cookie)

cookie可以是临时的,仅在一个浏览器会话中有效,也可以存储在客户端的磁盘上。为了使cookie变成永久的,必须使用HttpCookie对象设置成Expires属性。

Var cookie = new HttpCookie(“mycookie”)

cookie.Values.Add(“mystate”,“myval”)

cookie.Expires = DateTime.Now.AddMonths(3)

Response.Cookies.Add(cookie)

浏览器只能给一个服务器存储20个cookie,给所有服务器存储300个cookie。存储的数据不能超过4K.

服务器端状态管理

-会话

会话状态与浏览器相关,客户在服务器第一次打开ASP.NET页面时,会话就开始了。当客户在20分钟内美欧访问服务器时,会话结束。

会话状态可以存储在HttpSessionState对象中。可以使用Page类的Session属性来访问与当前HTTP上下文相关的会话状态对象。

-应用程序

如果应在多个客户端之间共享数据,就可以使用应用程序状态。使用HttpApplicationState类。在改变应用程序变量之前,必须用Lock()方法锁定应用程序对象。否则就会出现线程问题,因为多个客户可以同时访问一个应用程序变量。

不要在应用程序状态中存储太多的数据,因为应用程序状态需要占用服务器资源,直到服务器停止或重新启动之后,才会释放这些资源。

-缓存

缓存是服务器状态,它类似于应用程序状态,因为它在所有客户端上共享。缓存比应用程序状态灵活,可以通过多种方式来定义状态的失效时间。对于缓存,需要使用System.Web.Caching名称空间和Cache类。