1. ViewState
前面已讨论过在客户端存储状态的一种技术:ViewState。Web 服务器控件自动使用ViewState
来使事件工作。ViewState 包含的状态与控件发送给客户端时包含的状态相同。当浏览器把窗体发送
回服务器时,ViewState 包含了初始值,但所发送的控件包含新值。如果初始值和新值有区别,就调
用相应的事件处理程序。
使用ViewState 的缺点是,数据总是要从服务器传送给客户端,再从客户端传送给服务器,增
加了网络流量。为了减少网络流量,可以关闭ViewState。在Page 指令中把EnableViewState 属性设
置为false,就可以关闭页面中所有控件的ViewState。
2. cookie
cookie 在HTTP 头中定义。使用HttpResponse 类可以把cookie 发送给客户端。Response 是Page
类的一个属性,它返回一个HttpResponse 类型的对象。HttpResponse 类定义了返回HttpCookieCollection
的Cookies 属性。使用HttpCookieCollection 可以向客户端返回多个cookie。
cookie 可以是临时的,仅在一个浏览器会话中有效,也可以存储在客户端的磁盘上。为了使
cookie 变成永久的,必须使用HttpCookie 对象设置Expires 属性。使用Expires 属性可以定义cookie
不再有效的日期,这里把它设置为三个月后。
尽管可以设置特定的日期,但无法保证cookie 会一直存储到该日期为止。用户可以删除cookie,如
果在本地存储了太多的cookie,浏览器应用程序也会删除cookie。浏览器只能给一个服务器存储20 个
cookie,给所有的服务器存储300 个cookie。达到这个界限时,就会删除一段时间内不再使用的cookie。
客户从服务器上请求一个页面时,这个服务器的cookie 就可以在客户端上使用,并作为HTTP 请求
的一部分发送给服务器。要在ASP.NET 页面中读取cookie,可以访问HttpRequest 对象中的cookie 集合。
与HTTP 响应一样,Page 类也有一个Request 属性返回HttpRequest 类型的对象。Cookies 属性
返回HttpCookieCollection,它可以用于读取客户端发送的cookie。可以用索引符通过其名称来访问
cookie,然后使用HttpCookie 的Values 属性从cookie 中获取值。
ASP.NET 允许更加方便地使用cookie。但必须了解cookie 的限制。如前所述,浏览器只能接收
来自一个服务器的20 个cookie,以及来自所有服务器的300 个cookie。另外,cookie 存储的数据量
不能超过4K。这些限制使客户端磁盘不会被cookie 占满。
服务器端的状态管理
除了在客户端上保存状态之外,还可以在服务器上保存状态。使用客户端的状态,其缺点在于
增加了数据在网络之间的传送。使用服务器端状态的缺点在于,服务器必须给其客户端分配资源。
下面详细讨论服务器端的状态管理技术。
1. 会话Session
会话状态与浏览器会话相关。客户在服务器上第一次打开ASP.NET 页面时,会话就开始了。当
客户在20 分钟之内没有访问服务器时,会话结束。
2. 应用程序
如果应在多个客户端之间共享数据,就可以使用应用程序状态。应用程序状态的使用方式与会
话状态非常类似。对于应用程序状态,应使用HttpApplicationState 类,通过Page 类的Application
属性可以访问它。
不要在应用程序状态中存储太多的数据,因为应用程序状态需要占用服务器资源,直到服务器
停止或重启动之后,才会释放这些资源。
3. 缓存
缓存是服务器端状态,它类似于应用程序状态,因为它在所有的客户端上共享。缓存与应用程
序状态的区别是,缓存要灵活得多:可以通过多种方式来定义状态的失效时间。我们不是给每个请
求读取文件或数据库,而是把数据存储在缓存中。对于缓存,需要使用System.Web.Caching 名称空间和Cache 类
- Cache.Add("mycache", myobj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, null);
缓存。Add()方法的第一个参数定义了缓存项的名称。第二个参数是应缓存的对象。第三个参数定义
了依赖关系,例如,缓存项可以依赖于一个文件:当文件改变时,缓存对象就会失效。在上面的示
例中,没有定义依赖关系,因为这个参数设置为null。
第四和五个参数用于设置缓存项的有效时间。第四个参数定义了缓存项失效的绝对时间。第五
个参数定义了使缓存项失效的相对时间(即从最后一次访问以来经历的时间)。上面的示例使用了相
对时间,如果缓存项10 分钟以来未受到访问,就会失效。
第六个参数定义了缓存的优先级。CacheItemPriority 是一个设置缓存优先级的枚举。如果
ASP.NET 辅助进程有很高的内存利用率,ASP.NET 运行库就根据优先级删除缓存项。优先级较低的
项先删除。最后一个参数用于定义一个方法,在删除缓存项时调用该方法。当缓存依赖于一个文件
时,就可以使用最后一个参数:当文件改变时,就删除缓存项,调用事件处理程序。通过这个事件
处理程序,可以再次读取文件,重新加载缓存。
使用前面介绍的索引符和会话状态或应用程序状态,就可以读取缓存项。在使用从Cache 属性
返回的对象之前,必须检查结果是否为null,当缓存失效时,结果就是null。如果从Cache 索引符
返回的值不是null,就可以对返回的对象进行类型转换,用于存储缓存项:
- object o = Cache["mycache"];
- if (o == null)
- {
- // Reload the cache.
- }
- else
- {
- // Use the cache.
- MyClass myObj = (MyClass)o;
- //...
- }