如何在ASP.NET中缓存对象列表

时间:2010-01-23 20:48:06

标签: asp.net caching object

我在asp.net页面中有一个对象列表。当页面第一次在浏览器中加载时,我从数据库中获取数据,使用这些数据创建对象并填充列表。所有这些都在页面加载事件处理程序中完成。现在当页面回发到页面时,之前的列表就消失了,因为变量都被释放了。

如何缓存该列表,以便在回发此页面时,我的所有对象都可用?

5 个答案:

答案 0 :(得分:4)

正如@Eilon所问,这些数据是用户特定的还是特定于网站的?

如果数据是特定于用户的,则可以使用会话状态来存储它,但是当用户会话结束时它将过期,并且在某些情况下仍然可以调用到数据库服务器的往返(例如,如果它是由SQL服务器而不是in-proc等。)

如果数据是应用程序范围的,您也可以使用Application Cache。它是站点范围的,驻留在进程域中,因此对于在该服务器上具有会话的每个人都可以使用。在多服务器场景中使用它时必须特别小心,但它很容易实现。

应该注意的是,如果设置需要时间,应用程序缓存(以及任何其他全局设置)可能会使您的应用加载第一个用户访问网站的速度变慢。 IIS7和ASP.NET尝试使用最近发布的模块解决此问题,该模块会定期唤醒您的应用程序以确保全局缓存已预先填充或保持活动状态。

答案 1 :(得分:3)

使用Cache.Add(key_name, list_object, ...)保存列表,然后使用Cache[key_name]检索它(您需要将检索到的对象强制转换为适当的类型)。 Add方法有几个参数来指定缓存对象是否以及何时到期。

Cache对象实际上是System.Web.Caching.Cache,可以从您的aspx页面访问,也可以HttpContext.Current.Cache访问。

答案 2 :(得分:3)

如果它仅与此页面相关,我将使用ViewState。 如果您之前使用了sessionstate,则语法很熟悉: 设置:

ViewState["Persons"] = new List<Person>();

阅读

List<Person> persons = ViewState["Persons"] as List<Person>;

视图状态数据仅保留在此页面中,但作为(序列化)文本与您的页面一起发送,因此不要将其用于1000人,因为您的页面将是一个非常大的下载。 如果您有大量数据,则最好使用Cache对象,但前提是您不在Web场中并且记得在不再需要数据并使用缓存键时暂时清除数据每个用户,如果它是每个用户数据。 最后你可以使用Session状态,它是一个每用户存储,但是当你不再需要数据时,记得偶尔清除一次数据。

所以,根据情况可以选择很多。

米歇尔

答案 3 :(得分:1)

使用HttpContext.Current.Session。

答案 4 :(得分:1)

要添加到GrayWizard的答案,您也可以使用viewstate,但由于它包含在回发中,因此请确保您没有持久占用大量空间或需要安全的内容,因为默认情况下它没有加密。

这是一个概述 - 它已过时,但仍然相关。

http://msdn.microsoft.com/en-us/magazine/cc300437.aspx