Domanda

Per il mio blog desidero utilizzare la cache di output per salvare una versione memorizzata nella cache di un post specifico per circa 10 minuti, e va bene...

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

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

Come posso farlo in ASP.Net C#?

È stato utile?

Soluzione

Ho trovato la risposta che cercavo:

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

Altri suggerimenti

Quanto sopra va bene se sai per quali pagine vuoi svuotare la cache.Nella mia istanza (ASP.NET MVC) ho fatto riferimento agli stessi dati da ogni parte.Pertanto, quando ho eseguito un [salvataggio] volevo svuotare la cache in tutto il sito.Questo è ciò che ha funzionato per me: http://aspalliance.com/668

Questa operazione viene eseguita nel contesto di un filtro OnActionExecuting.Potrebbe essere fatto altrettanto facilmente 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);
}

Modifica minore:Ho un aiutante che aggiunge "messaggi flash" (messaggi di errore, messaggi di successo - "Questo elemento è stato salvato con successo", ecc.).Per evitare che il messaggio flash venisse visualizzato ad ogni GET successivo, ho dovuto invalidarlo dopo aver scritto il messaggio flash.

Cancellazione della cache:

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

Spero che questo ti aiuti.

Utilizzo di 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ò essere utilizzato anche in OutputCachedPage di ASP.NET MVC.

Nell'evento di caricamento della pagina master, 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 su:

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

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

L'avvertenza è che ciò non cancella effettivamente la cache.Se un post di blog riceve un utilizzo intenso dei commenti, la cache potrebbe aumentare di dimensioni con questo metodo.

In alternativa, potresti implementare le parti non modificabili della pagina (la navigazione, gli annunci, l'effettivo post sul blog) come controlli utente e implementare la memorizzazione parziale della pagina nella cache su ciascuno di questi controlli utente.

Se cambi "*" solo nei parametri su cui dovrebbe variare la cache (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 funzionerebbe anche con VaryByParam *, poiché tutte le richieste sarebbero legate alla stessa dipendenza dalla cache.

perché non utilizzare la dipendenza sqlcache nella tabella dei post?

sqlcachedependency msdn

In questo modo non stai implementando un codice personalizzato per la pulizia della cache e stai semplicemente aggiornando la cache man mano che il contenuto cambia nel db?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top