【问题标题】:Is it OK to use HttpRuntime.Cache outside ASP.NET applications?可以在 ASP.NET 应用程序之外使用 HttpRuntime.Cache 吗?
【发布时间】:2026-01-15 17:55:02
【问题描述】:

斯科特·汉塞尔曼says yes.

将 System.Web 添加到您的非 Web 项目是让人们恐慌的好方法。另一个是在 C# 应用程序中添加对 Microsoft.VisualBasic 的引用。不过,两者都是合理且非常有用的事情。

MSDN says no.

Cache 类不适合在 ASP.NET 应用程序之外使用。它是为在 ASP.NET 中使用而设计和测试的,以便为 Web 应用程序提供缓存。在其他类型的应用程序中,例如控制台应用程序或 Windows 窗体应用程序,ASP.NET 缓存可能无法正常工作。

那我应该怎么想?

【问题讨论】:

  • +1 的问题:我当然希望看到权威的回应 - 即为什么 MSDN 说不,以及在 ASP.NET 环境之外使用它的具体问题是什么。我已经在客户端使用的类库中使用了它,没有任何问题。

标签: .net caching


【解决方案1】:

为什么不完全避免这个问题并使用Caching Block of Enterprise Library?您可以使用 System.Web.Caching,但如果遇到问题,您可能无法获得 Microsoft 支持,而且您会引起注意,因此可能不值得。

【讨论】:

  • 恕我直言企业库还可以,但对于某些用途来说有点重。
  • 你肯定不会得到 Enterprise Library 的支持!
  • EntLib 的使用和设置比较困难。
【解决方案2】:

要记住的一点是,Microsoft 已经发布了 .NET Framework 客户端配置文件安装包。这是针对客户端应用程序的 3.5 框架版本,占用空间更小。客户端配置文件不包括框架的 ASP.NET 部分。

如果您的应用程序依赖于 System.Web,它将阻止您的应用程序利用客户端配置文件。

更多详情请见Scott Gu's Blog

【讨论】:

    【解决方案3】:

    不要使用它,即使它确实有效,它也会在下一个服务包/版本中停止工作。

    当您根据内部实现细节而不是合同(在本例中为 MSDN)做某事时,您可能会在未来遇到麻烦。

    【讨论】:

      【解决方案4】:

      使用 HttpRuntime.Cache 应该没有任何问题。这是一个复杂的内存哈希表,在 Web 环境之外非常有用。不过,在非 Http 相关的应用程序中引用 HttpRuntime.Cache 可能有点代码味道,因此最好将其封装在某个 ICache 接口后面并尽可能使用它。

      【讨论】:

        【解决方案5】:

        除了接受CacheItemUpdateCallbackInsert()方法外,当前版本的System.Web.Caching.Cache似乎没有任何依赖于HTTP运行时的东西,所以Scott 在很大程度上是正确的。

        这不会阻止 Microsoft 将来修改该类以更好地与 HTTP 基础结构集成。

        我在另一个答案中写了WeakReference-based lightweight cache

        【讨论】:

          【解决方案6】:

          我曾经使用过它,但感觉不太对劲,而且 IIRC 显着增加了内存占用。相反,我实现了自己的轻量级缓存机制,这非常容易做到。

          它利用了WeakReference 类,该类允许缓存保留对对象的引用,但也允许垃圾收集器在引用未使用时回收内存。

          我唯一没有的是一个单独的线程来清理缓存中的陈旧项目。我所做的是,如果缓存中有 > x 项,我会检查所有缓存项并在添加新项之前删除旧项。

          如果您需要更强大的东西,请使用 MS Enterprise Library Caching Application Block 之类的东西。

          【讨论】:

            【解决方案7】:

            我意识到这个问题已经过时了,但是为了帮助任何通过搜索找到这个问题的人,值得注意的是,.net v4 包含一个用于此类场景的新通用缓存。它在 System.Runtime.Caching 命名空间中:

            https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx

            默认缓存实例的静态引用是:MemoryCache.Default

            【讨论】:

            • System.Runtime.Caching 不在客户端配置文件中,要使用它,您需要完整的框架,因此对于客户端应用程序来说有点没用。
            • @Juan - 是的,不幸的是它没有包含在客户资料中。根据错误报告,微软计划最终将其移至那里。您可以通过投票表示您对修复的支持:connect.microsoft.com/VisualStudio/feedback/details/558309/…
            【解决方案8】:

            如果您正在寻找通用解决方案:这是依赖注入方法的典型情况。使用这种方法,您可以关注 Scott Hanselman MSDN!

            注入像 HttpRuntime.Cache 这样的 System.Web 依赖项,而您的库中没有 System.Web 引用。

            【讨论】: