如何在Console应用程序中使用System.Web.Caching.Cache?

Ron*_*ein 29 .net caching console-application httpcontext

上下文:.Net 3.5,C#
我想在我的控制台应用程序中使用缓存机制.
我想使用System.Web.Caching.Cache(而这是最后的决定,我不能使用其他缓存框架,不要问为什么),而不是重新发明轮子.
但是,它看起来System.Web.Caching.Cache应该只在有效的HTTP上下文中运行.我非常简单的代码片段如下所示:

using System;
using System.Web.Caching;
using System.Web;

Cache c = new Cache();

try
{
    c.Insert("a", 123);
}
catch (Exception ex)
{
    Console.WriteLine("cannot insert to cache, exception:");
    Console.WriteLine(ex);
}
Run Code Online (Sandbox Code Playgroud)

结果是:

cannot insert to cache, exception:
System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Web.Caching.Cache.Insert(String key, Object value)
   at MyClass.RunSnippet()

显然,我在这里做错了.有任何想法吗?


更新:+1到大多数答案,通过静态方法获取缓存是正确的用法,即HttpRuntime.CacheHttpContext.Current.Cache.谢谢你们!

Ami*_*t G 56

Cache构造函数的文档说它仅供内部使用.要获取Cache对象,请调用HttpRuntime.Cache,而不是通过构造函数创建实例.


Joe*_*ore 28

虽然OP指定了v3.5,但是在v4发布之前就提出了这个问题.为了帮助发现此问题并且可以使用v4依赖项的任何人,框架团队为此类场景创建了一个新的通用缓存.它位于System.Runtime.Caching命名空间中:http: //msdn.microsoft.com/en-us/library/dd997357%28v=VS.100%29.aspx

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

  • 很有用!我在我的webapp中切换调用以使用这种新方法.现在可以对这些方法进行单元测试,而无需定义HttpContext.Cache.:) (3认同)

Ric*_*dOD 9

如果您不想重新发明轮子,只需使用缓存应用程序块.如果您仍想使用ASP.NET缓存 - 请参阅此处.我很确定这只适用于.NET 2.0及更高版本.在.NET 1中,无法在ASP.NET之外使用缓存.

MSDN在页面上也有一个很好的警告:

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

对于一个非常轻量级的解决方案,您不必担心过期等,那么字典对象就足够了.