Подтвердить что ты не робот

Как я могу использовать System.Web.Caching.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. Спасибо всем!

4b9b3361

Ответ 1

Документация для конструктора Cache говорит, что он предназначен только для внутреннего использования. Чтобы получить объект Cache, вызовите HttpRuntime.Cache, а не создайте экземпляр через конструктор.

Ответ 2

В то время как OP задан v3.5, вопрос был задан перед выпуском v4. Чтобы помочь любому, кто находит этот вопрос и может жить с зависимостью v4, команда фреймворка создала новый общий кэш для этого типа сценария. Он находится в пространстве имен System.Runtime.Caching: http://msdn.microsoft.com/en-us/library/dd997357%28v=VS.100%29.aspx

Статическая ссылка на экземпляр кеша по умолчанию: MemoryCache.Default

Ответ 3

Просто используйте Кэширующий блок приложений, если вы не хотите изобретать колесо. Если вы все еще хотите использовать кеш ASP.NET см. Здесь. Я уверен, что это работает только с .NET 2.0 и выше. Просто было невозможно использовать кеш вне ASP.NET в .NET 1.

MSDN также имеет большое предупреждение на странице для документации по кэшу:

Класс Cache не предназначен для использовать вне приложений ASP.NET. Он был разработан и протестирован для использования в ASP.NET для обеспечения кэширования для Интернета Приложения. В других типах приложений, таких как консоль приложений или Windows Forms приложений, кэширование ASP.NET может не работает правильно.

Для очень легкого решения, где вам не нужно беспокоиться об истечении срока действия и т.д., может потребоваться словарь.

Ответ 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;

Ответ 5

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

Ответ 6

Класс System.Web.Caching.Cache полагается на то, что его член "_cacheInternal" установлен объектом HttpRuntime.

Чтобы использовать классы System.Web.Caching, вам нужно создать объект HttpRuntime и установить свойство HttpRuntime.Cache. Вам действительно нужно будет эмулировать IIS.

Вам лучше использовать другие рамки кэширования, например: