2010-12-15 75 views
9

Au cours de Application_End() dans Global.aspx, HttpContext.Current est null. Je veux toujours être en mesure d'accéder au cache - il est en mémoire, donc je veux voir si je peux le référencer en quelque sorte pour enregistrer des bits sur le disque.C# ASP.NET: comment accéder au cache quand aucun HttpContext.Current n'est disponible (est null)?

Question - Y at-il un moyen de référencer le cache en mémoire quand HttpContext.Current est null? Peut-être que je pourrais créer une variable statique globale qui stockerait le pointeur vers le cache que je pourrais mettre à jour sur les requêtes HTTP (pseudo: "static <pointer X>" = HttpRequest.Current) et récupérer une référence au cache via ce pointeur dans Application_End()?

Existe-t-il un meilleur moyen d'accéder au cache en mémoire lorsqu'il n'y a pas de demande HTTP?

Répondre

4

À l'intérieur de l'événement Application_End, tous les objets de cache sont déjà éliminés. 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 l'ajout d'objets 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 
} 

S'il vous plaît laissez-moi savoir si cette approche n'est pas pour vous. J'espère que cela vous aidera avec votre question.

Cordialement, Dima.

9

J'utilise le getter suivant pour renvoyer un objet System.Web.Caching.Cache qui fonctionne pour moi.

get 
{ 
    return (System.Web.HttpContext.Current == null) 
     ? System.Web.HttpRuntime.Cache 
     : System.Web.HttpContext.Current.Cache; 
} 

qui soutient essentiellement jusqu'à James Gaunt, mais bien sûr ne va aider à obtenir le cache dans la demande de fin.

Editer: J'ai probablement reçu ceci d'un des commentaires sur le blog Scott Hanselman James lié à!