2013-04-24 11 views
34

Utilizzando ASP.Net MVC 3 Ho un controller quale uscita viene memorizzato nella cache utilizzando attributi [OutputCache]Come invalidare i dati della cache [OutputCache] da un controller?

[OutputCache] 
public controllerA(){} 

Vorrei sapere se è possibile invalidare la cache dati (Cache Server) per un controller specifico o in generale tutti i dati della cache chiamando un altro controller

public controllerB(){} // Calling this invalidates the cache 

risposta

50

è possibile utilizzare il metodo di RemoveOutputCacheItem.

Ecco un esempio di come si potrebbe usarlo: risposta azione

public class HomeController : Controller 
{ 
    [OutputCache(Duration = 60, Location = OutputCacheLocation.Server)] 
    public ActionResult Index() 
    { 
     return Content(DateTime.Now.ToLongTimeString()); 
    } 

    public ActionResult InvalidateCacheForIndexAction() 
    { 
     string path = Url.Action("index"); 
     Response.RemoveOutputCacheItem(path); 
     return Content("cache invalidated, you could now go back to the index action"); 
    } 
} 

L'Indice viene memorizzato nella cache sul server per 1 minuto. Se si preme l'azione InvalidateCacheForIndexAction, scadrà la cache per l'azione Index. Al momento non è possibile invalidare l'intera cache, è necessario eseguirla per azione memorizzata nella cache (non controller) poiché il metodo RemoveOutputCacheItem prevede l'url dello script lato server memorizzato nella cache.

+0

Grazie Darin, ho davvero apprezzato il tuo aiuto su questo! – GibboK

+2

Come si ottiene ciò per -> Location = OutputCacheLocation.Client, ci sono altri parametri/metodi specifici? –

+2

e10, non è possibile rimuovere dal server i dati memorizzati nella cache del browser client. Questo non ha senso. –

2

è possibile farlo utilizzando un attributo personalizzato, in questo modo:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public sealed class NoCacheAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
     filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); 
     filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
     filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     filterContext.HttpContext.Response.Cache.SetNoStore(); 

     base.OnResultExecuting(filterContext); 
    } 
} 

Poi sul controllerb si può fare:

[NoCache] 
public class controllerB 
{ 
} 
+3

Ciò invaliderà la cache lato client. Ma cosa succede se le viste di ControllerA sono memorizzate nella cache sul server (che è il comportamento predefinito)? –

+0

@DarinDimitrov Questo costringerà il client a ottenere una nuova versione * uncached * dal server. – mattytommo

+0

Sì, di ControllerB. Ma sta chiedendo come farlo con ControllerA che era quello decorato con l'attributo OutputCache in primo luogo. Dato che hai decorato ControllerB con l'attributo NoCache, non verrà mai memorizzato nella cache, ma non penso che questo sia ciò che viene chiesto qui. Vuole sapere come invalidare la cache di ControllerA quando qualcuno invia una richiesta a ControllerB in modo che le successive richieste a ControllerA non vengano più memorizzate nella cache. –

Problemi correlati