Question

Je veux être en mesure de maintenir certains objets entre redémarrage de l'application.

Pour ce faire, je veux des éléments spécifiques mises en cache de écriture sur le disque en fonction Global.asax Application_End() et re-charge les remettre 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 (il est une procédure de nettoyage automatique) - donc, 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 du cache lors de Application_End()

Était-ce utile?

La solution

Si vous voulez 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:

Importer espace de noms System.Web.Caching à votre application dans laquelle vous utilisez des objets en ajoutant le 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ée méthode suivante:

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

    //After this method cache object will be disposed
}

Autres conseils

Je vous encourage fortement à repenser votre approche. Vous pouvez décrire des détails de ce que vous essayez de faire, afin que nous puissions vous aider. Mais si vous êtes tout à fait mettre là-dessus, vous pouvez simplement sauvegarder 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);
    }
}

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 seraient la meilleure approche pour stocker vos valeurs mises en cache. C'est en ajoutant vos articles à cache avec un CacheItemRemovedCallback et stocker les valeurs sur le disque il.

En tant que solution de rechange vous pouvez stocker les données dans l'objet Application (Application [key]) ou créez simplement un static class et l'utiliser pour garder vos données dans l'application - dans ce cas, les données ne SILL disponible sur Application_End

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top