语境: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.Cache
和HttpContext.Current.Cache
。 谢谢你们!
对于缓存构造的文件说,这是仅供内部使用。 为了让您的缓存对象,调用HttpRuntime.Cache而不是通过构造函数创建一个实例。
虽然OP指定的v3.5版本,被问的问题发布V4之前。 为了帮助任何人谁发现这个问题,并可以用v4的依赖性住,框架团队创建了一个新的通用缓存这种类型的场景。 它在System.Runtime.Caching命名空间: http://msdn.microsoft.com/en-us/library/dd997357%28v=VS.100%29.aspx
静态参考默认缓存实例是:MemoryCache.Default
只需使用缓存应用程序块 ,如果你不想推倒重来。 如果你仍然想使用ASP.NET的cache 在这里看到 。 我敢肯定,这只是以上.NET 2.0,虽然工作。 这根本是不可能的使用ASP.NET缓存之外的.NET 1。
MSDN有缓存文件过多的页面上一个漂亮的大警告:
Cache类是不适合使用的ASP.NET应用程序之外。 它被设计用于在ASP.NET应用测试,为Web应用提供高速缓存。 在其他类型的应用程序,如控制台应用程序或Windows窗体应用程序,ASP.NET缓存可能无法正常工作。
对于一个非常轻量级的解决方案,让您不必担心过期等,则Dictionary对象可能就够了。
我这个页面知道同样的事情上结束。 下面是我在做什么(我不喜欢,但似乎工作就好了):
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;
尝试
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);
}
所述的System.Web.Caching.Cache类依赖于具有其成员“_cacheInternal”由的httpRuntime对象设置。
要使用System.Web.Caching类你必须创建一个对象的httpRuntime和设置HttpRuntime.Cache财产。 你会有效不得不效仿IIS。
你最好不要使用其他的缓存框架,如:
- 缓存应用程序块
- Spring.net
- NCACHE