Cancellare la cache della pagina in ASP.NET

Per il mio blog, desidero utilizzare Output Cache per salvare una versione cache di un post periculare per circa 10 minuti, e questo va bene …

 

Tuttavia, se qualcuno pubblica un commento, voglio cancellare la cache in modo che la pagina venga aggiornata e il commento possa essere visto.

Come faccio questo in ASP.Net C #?

Ho trovato la risposta che stavo cercando:

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

Quanto sopra va bene se si conoscono le pagine per cui si desidera cancellare la cache. Nella mia istanza (ASP.NET MVC) ho fatto riferimento agli stessi dati da tutto il mondo. Pertanto, quando ho fatto un salvataggio, volevo cancellare la cache dal sito. Questo è ciò che ha funzionato per me: http://aspalliance.com/668

Questo viene fatto nel contesto di un filtro OnActionExecuting. Potrebbe facilmente essere fatto sovrascrivendo OnActionExecuting in un BaseController o qualcosa del genere.

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

Impostare:

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

Minor Tweak: ho un helper che aggiunge “messaggi flash” (messaggi di errore, messaggi di successo – “questo elemento è stato salvato con successo”, ecc.). Per evitare che il messaggio flash venga visualizzato su ogni successivo GET, ho dovuto invalidare dopo aver scritto il messaggio flash.

Clearing Cache:

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

Spero che questo ti aiuti.

Utilizzare Response.AddCacheItemDependency per cancellare tutte le cache di output.

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

Questo può anche essere utilizzato in OutputCachedPage di ASP.NET MVC.

Nell’evento di caricamento della pagina principale, scrivi quanto segue:

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

e nel pulsante di disconnessione fare clic:

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

Hmm. È ansible specificare un attributo VaryByCustom sull’elemento OutputCache. Il valore di questo viene passato come parametro al metodo GetVaryByCustomString che è ansible implementare in global.asax. Il valore restituito da questo metodo viene utilizzato come indice negli elementi memorizzati nella cache: se si restituisce il numero di commenti sulla pagina, ad esempio, ogni volta che viene aggiunto un commento, una nuova pagina verrà memorizzata nella cache.

L’avvertenza a questo è che questo in realtà non cancella il cache. Se un post di blog ottiene un uso intensivo dei commenti, la tua cache potrebbe esplodere di dimensioni con questo metodo.

In alternativa, è ansible implementare i bit non modificabili della pagina (la navigazione, gli annunci, l’effettivo post di blog) mentre l’utente controlla e implementa il caching delle pagine parziale su ciascuno di questi controlli utente.

Se cambi “*” solo per i parametri su cui la cache dovrebbe variare (PostID?) Puoi fare qualcosa del genere:

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

e quando qualcuno aggiunge un commento …

 Cache.Remove(key); 

Immagino che questo funzionerebbe anche con VaryByParam *, dal momento che tutte le richieste sarebbero legate alla stessa dipendenza della cache.

perché non usare sqlcachedependency nella tabella dei post?

sqlcachedependency msdn

In questo modo non stai implementando il codice di cancellazione della cache personalizzato e semplicemente aggiorna la cache mentre il contenuto cambia nel db?

HttpRuntime.Close() .. Provo tutti i metodi e questo è l’unico che funziona per me