Question

Contexte: .Net 3.5, C #
J'aimerais disposer d'un mécanisme de mise en cache dans mon application console.
Au lieu de réinventer la roue, j'aimerais utiliser System.Web.Caching.Cache (et c'est une décision finale, je ne peux pas utiliser un autre cadre de mise en cache, ne demandez pas pourquoi). .
Cependant, il semble que System.Web.Caching.Cache soit supposé s'exécuter uniquement dans un contexte HTTP valide. Mon extrait très simple ressemble à ceci:

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

et le résultat est:

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()

Alors évidemment, je fais quelque chose de mal ici. Des idées?

Mettre à jour : +1 dans la plupart des réponses, obtenir le cache via des méthodes statiques est l'utilisation correcte, à savoir HttpRuntime.Cache et HttpContext.Current.Cache . Merci à tous!

Était-ce utile?

La solution

La documentation du constructeur de cache indique qu'il est destiné uniquement à un usage interne. Pour obtenir votre objet Cache, appelez HttpRuntime.Cache plutôt que de créer une instance via le constructeur.

Autres conseils

Alors que l'OP spécifiait la v3.5, la question était posée avant la publication de la v4. Pour aider les personnes qui trouvent cette question et à vivre avec une dépendance v4, l'équipe de la structure a créé un nouveau cache à usage général pour ce type de scénario. C'est dans l'espace de noms System.Runtime.Caching: http://msdn.microsoft.com/en -us / library / dd997357% 28v = VS.100% 29.aspx

La référence statique à l'instance de cache par défaut est la suivante: MemoryCache.Default

Utilisez simplement le la mise en cache du blocage d'application si vous ne le souhaitez pas. réinventer la roue. Si vous souhaitez toujours utiliser le cache ASP.NET voir ici . Je suis à peu près sûr que cela ne fonctionne qu'avec .NET 2.0 et supérieur. Il n’était tout simplement pas possible d’utiliser le cache en dehors d’ASP.NET dans .NET 1.

MSDN a également un gros avertissement sur la page pour la documentation du cache:

  

La classe Cache n'est pas destinée à   utiliser en dehors des applications ASP.NET.   Il a été conçu et testé pour une utilisation dans   ASP.NET pour fournir la mise en cache pour le Web   applications. Dans d'autres types de   applications, telles que console   applications ou Windows Forms   applications, la mise en cache ASP.NET pourrait   ne fonctionne pas correctement.

Pour une solution très légère, où vous n'avez pas à vous soucier de l'expiration, etc., un dictionnaire peut suffire.

J'ai fini sur cette page en me demandant la même chose. Voici ce que je fais (ce que je n'aime pas mais semble fonctionner parfaitement):

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;

Essayez

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

La classe System.Web.Caching.Cache repose sur le membre " _cacheInternal " défini par l'objet HttpRuntime.

Pour utiliser les classes System.Web.Caching, vous devez créer un objet HttpRuntime et configurer la propriété HttpRuntime.Cache. Vous devez effectivement imiter IIS.

Vous feriez mieux d'utiliser d'autres infrastructures de mise en cache telles que:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top