Pregunta

Quiero ser capaz de mantener ciertos objetos entre reinicia la aplicación.

Para hacer eso, quiero artículos específicos en caché de escritura a disco en función Application_End() Global.asax y volver a la carga de nuevo en Application_Start().

Actualmente tengo una clase de ayudante de caché, que utiliza el método siguiente para devolver el valor almacenado en caché:

return HttpContext.Current.Cache[key];

Problema . Durante Application_End(), HttpContext.Current es nula ya que no hay solicitud web (que es un procedimiento de limpieza automática) -, por lo tanto, no puedo .Cache[] acceso para recuperar alguno de los artículos para ahorrar en el disco

Pregunta :? ¿Cómo puedo acceder a los elementos de la caché durante Application_End()

¿Fue útil?

Solución

Si desea obtener acceso a objeto de caché antes de que sea dispuesto, es necesario utilizar somethink como este para añadir objetos a la caché:

Importar espacio de nombres System.Web.Caching a su aplicación en la que está utilizando objetos añadiendo a la memoria caché.

//Add callback method to delegate
var onRemove = new CacheItemRemovedCallback(RemovedCallback);

//Insert object to cache
HttpContext.Current.Cache.Insert("YourKey", YourValue, null, DateTime.Now.AddHours(12), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, onRemove);

Y cuando este objeto va a ser dispuesta, será llamado método siguiente:

private void RemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
    //Use your logic here

    //After this method cache object will be disposed
}

Otros consejos

Le recomiendo a reconsiderar su enfoque. Es posible que desee para describir detalles de lo que estás tratando de hacer, así que usted podría ayudar con eso. Pero si se fijan totalmente en él, entonces puede simplemente valores guardados en el disco cuando realmente se les configura, es decir, su clase de ayuda haría es como la siguiente:

public static class CacheHelper
{
    public static void SetCache(string key, object value)
    {
        HttpContext.Current.Cache[key] = value;
        if (key == "some special key")
            WriteValueOnDisk(value);
    }
}

Se puede acceder a la caché a través HttpRuntime.Cache cuando no tiene una HttpContext disponible. Sin embargo, en Application_End, creo que la memoria caché ya se vacía.

contornos

La solución Dima Shmidt sería el mejor enfoque para almacenar los valores almacenados en caché. Es decir mediante la adición de sus elementos a la caché con un CacheItemRemovedCallback, y almacenar los valores en el disco allí.

Como solución alternativa podría almacenar los datos en el objeto Application (Solicitud [clave]) o simplemente crear un static class y lo utilizan para mantener sus datos dentro de la aplicación - en este caso los datos sería alféizar de estar disponibles a Application_End

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