ASP.NET中Application、Cookie、Session、Cache和ViewState
我们在做asp.net开发的时候经常会用到回话,我们在回话中存储一些数据,下面让我们来一一介绍一下application、cookie、session、cache和viewstate,以便我们选择在什么时候使用它们。
一、application
application 提供对所有会话的应用程序范围的方法和事件的访问。还提供对可用于存储信息的应用程序范围的缓存的访问。应用程序状态是可供 asp.net 应用程序中的所有类使用的数据储存库。它存储在服务器的内存中,因此与在数据库中存储和检索信息相比,它的执行速度更快。与特定于单个用户会话的会话状态不同,应用程序状态应用于所有的用户和会话。因此,应用程序状态非常适合存储那些数量少、不随用户的变化而变化的常用数据。
application的关键特性有:存储于服务器内存中,与用户无关即多用户共享,在应用程序的整个生存期中存在即不会被主动丢弃,不被序列化,不发生服务器-客户端的数据传输。
二、cookie
cookie 提供了一种在 web 应用程序中存储用户特定信息的方法。例如,当用户访问您的站点时,您可以使用 cookie 存储用户首选项或其他信息。当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息。在开发人员以编程方式设置cookie时,需要将自己希望保存的数据序列化为字符串(并且要注意,很多浏览器对cookie有4096字节的限制)然后进行设置。
cookie的关键特性有:存储于客户端硬盘上,与用户相关,在一定时间内持久化存储,可以跨浏览器共享数据,需要被序列化,发生服务器-客户端数据传输。
三、session
session 为当前用户会话提供信息。还提供对可用于存储信息的会话范围的缓存的访问,以及控制如何管理会话的方法。应用程序状态是可供 asp.net 应用程序中的所有类使用的数据储存库。它存储在服务器的内存中,因此与在数据库中存储和检索信息相比,它的执行速度更快。与不特定于单个用户会话的应用程序状态不同,会话状态应用于单个的用户和会话。因此,应用程序状态非常适合存储那些数量少、随用户的变化而变化的常用数据。而且由于其不发生服务器-客户端数据传输,session还适合存储关于用户的安全数据,如购物车信息。
session的关键特性有:存储于服务器内存中,与会话相关,在会话的整个生存期中存在即不会被主动丢弃,不被序列化,不发生服务器-客户端数据传输。
四、cache
asp.net 为您提供了一个强大的、便于使用的缓存机制,用于将需要大量服务器资源来创建的对象存储在内存中。缓存这些类型的资源会大大改进应用程序的性能。它存储于服务器的内存中,允许您自定义如何缓存项以及将它们缓存多长时间。例如,当缺乏系统内存时,缓存会自动移除很少使用的或优先级较低的项以释放内存。该技术也称为清理,这是缓存确保过期数据不使用宝贵的服务器资源的方式之一。它不与会话相关,所以它是多会话共享的,因此使用它可以提高网站性能,但是可能泄露用户的安全信息,还由于在服务器缺乏内存时可能会自动移除cache因此需要在每次获取数据时检测该cache项是否还存在。
cache的关键特性有:存储于服务器内存中,与会话无关,根据服务器内存资源的状况随时可能被丢弃,不被序列化,不发生服务器-客户端数据传输。
在这里,我还希望对viewstate也顺便做一个描述,以便与上面四种数据持久化的方式做一个对比。因为,viewstate虽然不能够跨页面共享数据,但是在同一个页面里,可以用于在对同一页的多个请求之间保留值。
五、viewstate
viewstate 属性提供一个字典对象,用于在对同一页的多个请求之间保留值。这是页用来在往返行程之间保留页和控件属性值的默认方法。在处理页时,页和控件的当前状态会散列为一个字符串,并在页中保存为一个隐藏域或多个隐藏域(如果存储在 viewstate 属性中的数据量超过了 maxpagestatefieldlength 属性中的指定值)。当将页回发到服务器时,页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。也可以使用视图状态来存储值。在默认情况下,viewstate不被加密,并且发生服务器-客户端数据传输。
viewstate的关键特性有:存储于页面上,与会话且与页面相关,被序列化,默认发生服务器-客户端传输,默认不被加密。
至于在什么样的情况下viewstate不发生服务器端-客户端传输,或者被加密,我们将在后面的章节中予以讲述。
综上,我们总结出一些常见而典型的例子:
电子商务网站的购物车:使用session,因为购物车信息是会话相关的而且安全性很重要。
论坛或其它网站的“记住我”功能:使用cookie,因为这是保存的往往只是一个用户名,而且当用户下次登陆时还需要这个用户名仍然存在。
站点计数器:如果您不用数据库的话那就是使用application了,因为计数器是会话无关的。但是即使在使用数据库的情况下我也建议你同时使用application来保存计数值,然后再每隔一段时间保存到数据库里去,因为这样可以减少访问数据库的次数以提高性能。
产品信息:cache是优先的选择,因为产品信息通常是与会话无关、修改频率低且访问频率高的数据,使用cache来保存可以有效地提高网站的性能。
最后,我们给出一个表格,列出以上几种数据持久化方式的特性对比,以便您做出决定:
application | cache | session | cookie | viewstate | |
存储位置 | 服务器 | 服务器 | 服务器 | 客户端 | 客户端 |
是否会被主动丢弃 | 不会 | 会 | 不会 | 不会 | 不会 |
与会话相关 | 否 | 否 | 是 | 是 | 是 |
是否被序列化 | 否 | 否 | 否 | 是 | 是 |
是否发生服务器-客户端传输 | 否 | 否 | 否 | 是 | 是(默认情况) |
是否被加密 | 否 | 否 | 否 | 是 | 否(默认情况) |