Ответ 1
Документация для конструктора Cache говорит, что он предназначен только для внутреннего использования. Чтобы получить объект Cache, вызовите HttpRuntime.Cache, а не создайте экземпляр через конструктор.
Контекст:.Net 3.5, С#
Я хотел бы иметь механизм кеширования в моем приложении консоли.
Вместо того, чтобы повторно изобретать колесо, я бы хотел использовать 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
. Спасибо всем!
Документация для конструктора Cache говорит, что он предназначен только для внутреннего использования. Чтобы получить объект 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 см. Здесь. Я уверен, что это работает только с .NET 2.0 и выше. Просто было невозможно использовать кеш вне ASP.NET в .NET 1.
MSDN также имеет большое предупреждение на странице для документации по кэшу:
Класс Cache не предназначен для использовать вне приложений ASP.NET. Он был разработан и протестирован для использования в ASP.NET для обеспечения кэширования для Интернета Приложения. В других типах приложений, таких как консоль приложений или Windows Forms приложений, кэширование ASP.NET может не работает правильно.
Для очень легкого решения, где вам не нужно беспокоиться об истечении срока действия и т.д., может потребоваться словарь.
Я закончил на этой странице, задаваясь вопросом то же самое. Вот что я делаю (что мне не нравится, но, похоже, работает нормально):
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;
Try
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.
Вам лучше использовать другие рамки кэширования, например: