如何使用的System.Web.Caching.Cache在一个控制台应用程序?(How can I

2019-07-29 05:02发布

语境:3.5的.Net,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 。 谢谢你们!

Answer 1:

对于缓存构造的文件说,这是仅供内部使用。 为了让您的缓存对象,调用HttpRuntime.Cache而不是通过构造函数创建一个实例。



Answer 2:

虽然OP指定的v3.5版本,被问的问题发布V4之前。 为了帮助任何人谁发现这个问题,并可以用v4的依赖性住,框架团队创建了一个新的通用缓存这种类型的场景。 它在System.Runtime.Caching命名空间: http://msdn.microsoft.com/en-us/library/dd997357%28v=VS.100%29.aspx

静态参考默认缓存实例是:MemoryCache.Default



Answer 3:

只需使用缓存应用程序块 ,如果你不想推倒重来。 如果你仍然想使用ASP.NET的cache 在这里看到 。 我敢肯定,这只是以上.NET 2.0,虽然工作。 这根本是不可能的使用ASP.NET缓存之外的.NET 1。

MSDN有缓存文件过多的页面上一个漂亮的大警告:

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

对于一个非常轻量级的解决方案,让您不必担心过期等,则Dictionary对象可能就够了。



Answer 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;


Answer 5:

尝试

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);
    }



Answer 6:

所述的System.Web.Caching.Cache类依赖于具有其成员“_cacheInternal”由的httpRuntime对象设置。

要使用System.Web.Caching类你必须创建一个对象的httpRuntime和设置HttpRuntime.Cache财产。 你会有效不得不效仿IIS。

你最好不要使用其他的缓存框架,如:

  • 缓存应用程序块
  • Spring.net
  • NCACHE


文章来源: How can I use System.Web.Caching.Cache in a Console application?