Application_End () no puede caché de acceso a través de HttpContext.Current.Cache [clave]
-
08-10-2019 - |
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 ??strong>:? ¿Cómo puedo acceder a los elementos de la caché durante Application_End()
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.
contornosLa 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