Pregunta

Contexto: .Net 3.5, C #
Me gustaría tener un mecanismo de almacenamiento en caché en mi aplicación de consola.
En lugar de reinventar la rueda, me gustaría usar System.Web.Caching.Cache (y esa es una decisión final, no puedo usar otro marco de almacenamiento en caché, no pregunte por qué) .
Sin embargo, parece que se supone que System.Web.Caching.Cache se ejecuta solo en un contexto HTTP válido. Mi fragmento muy simple se ve así:

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

y el resultado es:

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

Entonces, obviamente, estoy haciendo algo mal aquí. ¿Alguna idea?


Actualizar : +1 para la mayoría de las respuestas, obtener el caché mediante métodos estáticos es el uso correcto, a saber, HttpRuntime.Cache y HttpContext.Current.Cache . ¡Gracias a todos!

¿Fue útil?

Solución

La documentación para el constructor de caché dice que es solo para uso interno. Para obtener su objeto Cache, llame a HttpRuntime.Cache en lugar de crear una instancia a través del constructor.

Otros consejos

Mientras que el OP especificó v3.5, la pregunta se hizo antes de que se lanzara v4. Para ayudar a cualquiera que encuentre esta pregunta, y pueden vivir con una dependencia v4, el equipo de framework creó un nuevo caché de propósito general para este tipo de escenario. Está en el espacio de nombres System.Runtime.Caching: http://msdn.microsoft.com/en -us / library / dd997357% 28v = VS.100% 29.aspx

La referencia estática a la instancia de caché predeterminada es: MemoryCache.Default

Simplemente use el Bloqueo de aplicaciones de almacenamiento en caché si no desea para reinventar la rueda. Si aún desea utilizar el caché ASP.NET- ver aquí . Sin embargo, estoy bastante seguro de que esto solo funciona con .NET 2.0 y versiones posteriores. Simplemente no era posible usar el caché fuera de ASP.NET en .NET 1.

MSDN también tiene una gran advertencia en la página para la documentación de caché:

  

La clase Cache no está destinada a   usar fuera de las aplicaciones ASP.NET.   Fue diseñado y probado para su uso en   ASP.NET para proporcionar almacenamiento en caché para Web   aplicaciones. En otros tipos de   aplicaciones, como la consola   aplicaciones o formularios de Windows   aplicaciones, el almacenamiento en caché ASP.NET podría   no funciona correctamente.

Para una solución muy ligera, donde no tiene que preocuparse por la caducidad, etc., entonces un objeto de diccionario podría ser suficiente.

Terminé en esta página preguntándome lo mismo. Esto es lo que estoy haciendo (que no me gusta pero parece funcionar bien):

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;

Probar

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 clase System.Web.Caching.Cache se basa en tener su miembro '' _cacheInternal '' establecido por el objeto HttpRuntime.

Para usar las clases System.Web.Caching, tendría que crear un objeto HttpRuntime y configurar la propiedad HttpRuntime.Cache. Efectivamente, tendría que emular IIS.

Es mejor usar otros marcos de almacenamiento en caché como:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top