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类。