ASP.net应用程序会话缓存最佳实践和模式

时间:2010-08-13 14:11:50

标签: asp.net session caching

在asp.net中,主要的数据存储是应用程序,会话,我们还有对象缓存。 我使用了常识提示/提示(例如,从不将用户特定数据放在应用程序中,永远不会将非托管资源放在会话中等等),但说实话,我从来没有遇到任何建议和示例,何时使用MSDN中的内容或来自Haack和Gu等知名人士共同报道这三个问题(例如谷歌首次访问MSDN谈论将应用程序用作全局缓存,如果是这样的话,对象缓存是什么?

我发现很少讨论的东西是场景中的比较,例如我知道在过度使用会话时很容易不必要地加载内存使用,但是如果你使用对象缓存作为存储相同数据的替代方案会发生什么?

编辑:这是我到目前为止找到的最佳信息:http://msdn.microsoft.com/en-us/library/ff647787.aspx

2 个答案:

答案 0 :(得分:2)

使用Session存储特定于用户的信息,因为框架会自动将每个会话存储与特定用户相关联。

使用对象缓存可以缓存一次并在整个应用程序或一组用户中重复使用的信息。如果您将特定于用户的数据存储在对象缓存中,那么您将不得不发明一些机制来关联缓存条目。这不仅需要代表您进行额外的工作,而且您可能会以这样的方式进行,以增加恶意用户以某种方式做类似于会话欺骗的可能性。

我不知道你什么时候需要使用Application对象。如果我没有弄错的话,Application对象更像是来自经典ASP的遗物而不是其他东西。

另一种形式的缓存同样重要的是通过HttpContext.Items集合进行每请求缓存。这允许您在请求的生命周期内缓存数据,如果您在单个请求期间(例如从页面上的不同用户控件)继续请求相同的数据,这将非常有用。有关此方法的详细信息,请参阅HttpContext.Items - a Per-Request Cache Store

答案 1 :(得分:0)

我建议创建一个包装类,至少对于会话,如果在整个代码中使用它们。这样,您可以注入类的实例来完成实际工作,并使用模拟版本进行单元测试。我这样做是为了一个广泛使用会话的大型项目,而且效果很好。

您可以将它与Facade模式结合使用 - 包装器将提供您需要的特定方法,而不是公开通用接口。例如,会话接受对象并返回对象,它不是强类型的。包装器可以有强类型的add和get方法。