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

时间:2009-06-24 11:06:39

标签: .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);
}

结果是:

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。谢谢大家!

6 个答案:

答案 0 :(得分:56)

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

答案 1 :(得分:28)

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

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

答案 2 :(得分:9)

如果您不想重新发明轮子,请使用Caching Application Block。如果您仍想使用ASP.NET缓存 - see here。我很确定这只适用于.NET 2.0及更高版本。在.NET 1中,根本无法在ASP.NET之外使用缓存。

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

  

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

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

答案 3 :(得分:4)

我在这个页面上结束了想知道同样的事情。这就是我正在做的事情(我不喜欢,但似乎工作得很好):

HttpContext context = HttpContext.Current;
if (context == null)
{
    HttpRequest request = new HttpRequest(string.Empty, "http://tempuri.org", string.Empty);
    HttpResponse response = new HttpResponse(new StreamWriter(new MemoryStream()));
    context = new HttpContext(request, response);
    HttpContext.Current = context;
}
this.cache = context.Cache;

答案 4 :(得分:1)

尝试

public class AspnetDataCache : IDataCache
{
    private readonly Cache _cache;

    public AspnetDataCache(Cache cache)
    {
        _cache = cache;
    }

    public AspnetDataCache()
        : this(HttpRuntime.Cache)
    {

    }
    public void Put(string key, object obj, TimeSpan expireNext)
    {
        if (key == null || obj == null)
            return;
        _cache.Insert(key, obj, null, DateTime.Now.Add(expireNext), TimeSpan.Zero);
    }

    public object Get(string key)
    {
        return _cache.Get(key);
    }

答案 5 :(得分:1)

System.Web.Caching.Cache类依赖于HttpRuntime对象设置其成员“_cacheInternal”。

要使用System.Web.Caching类,您必须创建一个HttpRuntime对象并设置HttpRuntime.Cache属性。你实际上必须模仿IIS。

最好使用其他缓存框架,例如: