2008-08-14 4 views
49

Pour mon blog, je suis désireux d'utiliser le cache de sortie pour enregistrer une version mise en cache d'un poste perticular pendant environ 10 minutes, et c'est bien ...Clearing cache dans ASP.NET

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

Cependant, Si quelqu'un publie un commentaire, je veux effacer le cache afin que la page soit actualisée et que le commentaire puisse être vu.

Comment faire cela dans ASP.Net C#?

Répondre

45

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

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

Est-ce que quelqu'un sait si quelque chose comme ceci est disponible pour ASP classique? – Brettski

+0

Je ne pense pas que la mise en cache était disponible dans ASP, donc pas désolé. – GateKiller

+0

Ceci efface tous les caches pour tous les paramètres de cette page. – Salim

1

Hmm. Vous pouvez spécifier un attribut VaryByCustom sur l'élément OutputCache. La valeur de this est passée en tant que paramètre à la méthode GetVaryByCustomString que vous pouvez implémenter dans global.asax. La valeur renvoyée par cette méthode est utilisée comme un index dans les éléments mis en cache - si vous renvoyez le nombre de commentaires sur la page, par exemple, chaque fois qu'un commentaire est ajouté, une nouvelle page sera mise en cache. L'inconvénient de ceci est que cela n'efface pas réellement le cache. Si une entrée de blog reçoit une forte utilisation de commentaires, votre cache pourrait exploser en taille avec cette méthode. Vous pouvez également implémenter les bits non modifiables de la page (la navigation, les annonces, l'entrée de blog proprement dite) en tant que contrôles utilisateur et implémenter la mise en cache partielle des pages sur chacun de ces contrôles utilisateur.

1

Si vous changez « * » pour seulement les paramètres du cache doit varier sur vous pouvez faire quelque chose comme ça (PostID?):

//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 de cache.

5

Utiliser Response.AddCacheItemDependency pour effacer tous outputcaches.

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

Cela peut également être utilisé dans OutputCachedPage d'ASP.NET MVC. Pourquoi ne pas utiliser sqlcachedependency sur la table des messages?

+0

Parfait, c'est ce que je cherche. Il n'y a qu'une seule chose à changer. HttpContext.Current.Cache.Remove (cacheKey); – Salim

1

sqlcachedependency msdn

De cette façon, vous n'êtes pas la mise en œuvre du code de compensation de cache personnalisé et rafraîchissant tout simplement le cache que le contenu change dans la db?

38

Ce qui précède est très bien si vous savez à quelles pages vous voulez effacer le cache. Dans mon cas (ASP.NET MVC), j'ai référencé les mêmes données de partout. Par conséquent, quand j'ai fait un [enregistrer] je voulais effacer le site du cache. C'est ce qui a fonctionné pour moi: http://aspalliance.com/668

Ceci est fait dans le contexte d'un filtre OnActionExecuting. Il pourrait tout aussi bien être fait en remplaçant OnActionExecuting dans un BaseController ou quelque chose.

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

Configuration:

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

Tweak Minor: J'ai une aide qui ajoute "messages flash" (messages d'erreur, messages succès - "Cet article a été enregistré avec succès", etc.). Afin d'éviter que le message flash apparaisse sur chaque GET suivant, j'ai dû invalider après avoir écrit le message flash.

Effacer le cache:

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

Hope this helps.

+3

Ir fonctionne uniquement pour la mise en cache complète des pages. Cela ne fonctionne pas pour les actions des enfants. Aucune suggestion? –

+3

and.maz avez-vous compris? –

+0

@ and.maz Si vous avez trouvé comment faire cela pour les actions enfants, il y a une prime [ici] (http://stackoverflow.com/q/5126751/63733). – marapet

0

HttpRuntime.Close() .. J'essaie toutes les méthodes et c'est le seul que le travail pour moi

+6

Je suppose que cela ferme l'ASP. Processus d'application NET sur IIS. Cela semble un peu excessif, permettrait probablement d'effacer toutes les caches et aurait des problèmes de performance importants sur les grands sites Web. – GateKiller

3

En cas de chargement de la page principale, s'il vous plaît écrivez ce qui suit:

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

et le bouton de fermeture de session, cliquez sur:

Session.Abandon(); 
Session.Clear(); 
Questions connexes