53 votes

Effacer le cache des pages en ASP.NET

Pour mon blog, je veux utiliser le cache de sortie pour sauvegarder une version en cache d'un article particulier pendant environ 10 minutes, et c'est bien...

<%@OutputCache Duration="600" VaryByParam="*" %>

Cependant, si quelqu'un publie un commentaire, je veux vider le cache pour que la page soit rafraîchie et que le commentaire soit visible.

Comment puis-je faire cela en ASP.Net C# ?

49voto

GateKiller Points 19113

J'ai trouvé la réponse que je cherchais :

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");

41voto

Kevin Points 757

Les méthodes ci-dessus conviennent si vous savez pour quelles pages vous voulez vider le cache. Dans mon cas (ASP.NET MVC), je faisais référence aux mêmes données partout. Par conséquent, lorsque je faisais une [sauvegarde], je voulais vider le cache de tout le site. Voici ce qui a fonctionné pour moi : http://aspalliance.com/668

Cela se fait dans le contexte d'un filtre OnActionExecuting. Cela pourrait tout aussi bien être fait en surchargeant OnActionExecuting dans un BaseController ou autre.

HttpContextBase httpContext = filterContext.HttpContext;
httpContext.Response.AddCacheItemDependency("Pages");

Mise en place :

protected void Application_Start()
{
    HttpRuntime.Cache.Insert("Pages", DateTime.Now);
}

Tweak mineur : J'ai un helper qui ajoute des "messages flash" (messages d'erreur, messages de succès - "Cet élément a été sauvegardé avec succès", etc). Afin d'éviter que le message flash ne s'affiche à chaque GET ultérieur, j'ai dû invalider après avoir écrit le message flash.

Nettoyage du cache :

HttpRuntime.Cache.Insert("Pages", DateTime.Now);

J'espère que cela vous aidera.

6voto

Utilisation de Response.AddCacheItemDependency pour vider tous les caches de sortie.

  public class Page : System.Web.UI.Page
  {
    protected override void OnLoad(EventArgs e)
    {
        try
        {
            string cacheKey = "cacheKey";
            object cache = HttpContext.Current.Cache[cacheKey];
            if (cache == null)
            {
              HttpContext.Current.Cache[cacheKey] = DateTime.UtcNow.ToString();
            }

            Response.AddCacheItemDependency(cacheKey);
        }
        catch (Exception ex)
        {
            throw new SystemException(ex.Message);
        }

        base.OnLoad(e);
    }     
 }

  // Clear All OutPutCache Method    

    public void ClearAllOutPutCache()
    {
        string cacheKey = "cacheKey";
        HttpContext.Cache.Remove(cacheKey);
    }

Cette méthode peut également être utilisée dans OutputCachedPage d'ASP.NET MVC.

3voto

Mohd Adil Points 11

Dans l'événement de chargement de la page principale, veuillez écrire ce qui suit :

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

et dans le bouton de déconnexion, cliquez :

Session.Abandon();
Session.Clear();

1voto

palmsey Points 3799

Si vous remplacez "*" par les seuls paramètres sur lesquels le cache doit varier (PostID ?), vous pouvez faire quelque chose comme ceci :

//add dependency
string key = "post.aspx?id=" + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);

et quand quelqu'un ajoute un commentaire...

Cache.Remove(key);

Je suppose que cela fonctionnerait même avec VaryByParam *, puisque toutes les demandes seraient liées à la même dépendance du cache.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X