2010-12-12 6 views
4

Je veux être en mesure de maintenir certains objets entre les redémarrages de l'application.Application_End() ne peut pas accéder au cache via HttpContext.Current.Cache [clé]

Pour ce faire, je veux écrire des éléments spécifiques mis en cache sur disque dans la fonction Global.asax Application_End() et les recharger sur Application_Start().

J'ai actuellement une classe d'aide de cache, qui utilise la méthode suivante pour renvoyer la valeur en cache:

return HttpContext.Current.Cache[key]; 

Problème: pendant Application_End(), HttpContext.Current est nul car il n'y a pas de demande web (c'est un automatique procédure de nettoyage) - par conséquent, je ne peux pas accéder .Cache[] pour récupérer l'un des éléments à enregistrer sur le disque.

Question: comment puis-je accéder aux éléments de cache pendant Application_End()?

Répondre

3

Si vous souhaitez avoir accès à l'objet cache avant qu'il ne soit disposé à, vous devez utiliser somethink comme celui-ci pour ajouter des objets à mettre en cache:

espace de noms Importer System.Web.Caching à votre application dans laquelle vous utilisez ajouter des objets au cache.

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

Et quand cet objet va être disposé sera appelé la méthode suivante:

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

    //After this method cache object will be disposed 
} 
+0

** utile ** peut-être: http://johnnycoder.com/blog/2008/12/10/c-cache-helper-class/ –

1

Je vous encourage fortement à repenser votre approche. Vous voudrez peut-être décrire les détails de ce que vous essayez de faire, afin que nous puissions vous aider avec cela. Mais si vous êtes tout à fait mettre là-dessus, vous pouvez simplement enregistrer les valeurs sur le disque lorsque vous les définissez en fait, à savoir votre classe d'aide serait ressemble à quelque chose comme ceci:

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

L'application fait une tonne d'écriture/mise à jour «sale» (santé du site, télémétrie, etc.), etc. - et les mises à jour se produisent trop souvent pour les écrire sur le disque tout le temps. Je veux juste les préserver entre les redémarrages d'applications. –

0

En tant que solution de rechange, vous pouvez stocker les données dans l'objet Application (Application [clé]) ou créez simplement un static class et utilisez-le pour conserver vos données dans l'application - dans ce cas, les données seront disponibles dès Application_End.

+0

Merci, Denis - les tableaux de données peuvent être trop grands - y a-t-il un autre moyen d'accéder au cache? Le problème est qu'il n'est pas disponible parce qu'il n'y a pas de demande - mais le cache doit toujours être accessible au moins en quelque sorte? –

+0

Bien, une autre suggestion serait de fournir CacheItemRemovedCallback (http://msdn.microsoft.com/en-us/library/system.web.caching.cacheitemremovedcallback.aspx) lors de l'ajout d'éléments au cache - la méthode fournie dans le rappel est automatiquement déclenché juste avant la fin de l'application .. fonctionne bien, sauf si vous effacez manuellement le cache ailleurs dans l'application. –

+0

Puisque le cache joue un grand rôle dans votre application - pourquoi ne pas profiter de l'utilisation d'AppFabric Caching/Velocity (http://www.hanselman.com/blog/InstallingConfiguringAndUsingWindowsServerAppFabricAndTheVelocityMemoryCacheIn10Minutes.aspx) .. Je pense qu'il préserve automatiquement le cache entre redémarre plus donne beaucoup plus d'avantages. –

1

Vous pouvez accéder au cache par HttpRuntime.Cache lorsque vous ne disposez pas d'un HttpContext disponible. Cependant, à Application_End, je crois que le cache est déjà vidé. La solution Dima Shmidt contours serait la meilleure approche pour stocker vos valeurs en mémoire cache. C'est en ajoutant vos éléments au cache avec un CacheItemRemovedCallback, et stockez les valeurs sur le disque là.

+0

déjà rincé. –

Questions connexes