Ho aggiunto la cache di output a un paio di azioni nella mia app per alcuni potenziamenti di prestazioni semplici. Tuttavia, queste azioni devono anche incrementare un contatore dopo ogni richiesta (è un contatore di visualizzazioni) colpendo un db Redis.Utilizzo della cache di output e altri filtri di azione
In un primo momento, ho pensato che avrei potuto solo regolare l'ordine in cui i filtri di azione eseguire per garantire la visualizzazione viene conteggiato:
public class CountersAttribute : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
//increment my counter all clever like
base.OnResultExecuted(filterContext);
}
}
Ma che non ha funzionato; apparentemente OutputCacheAttribute non si comporta come un normale filtro azione. Quindi ho provato a implementare una cache di output personalizzata:
public class OutputCacheWithCountersAttribute : OutputCacheAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
//straight to the source to get my headcount!
base.OnResultExecuted(filterContext);
}
}
No, non ha funzionato neanche; i filtri azione sembrano essere completamente ignorati una volta che un'azione viene memorizzata nella cache. Bummer.
Quindi, c'è un modo (senza implementare un fornitore di memorizzazione nella cache di output personalizzato) per assicurarmi che le mie visualizzazioni siano correttamente calcolate e pulite?
Questo funziona meravigliosamente, tranne che ora il mio param VaryByCustom non funziona. GetVaryByCustomString() viene chiamato in globals, ma Donut non sembra onorare le modifiche apportate a Response.Cache (ovvero, disattivare la cache per gli utenti autenticati). – Dusda
context.Response.Cache.SetCacheability (HttpCacheability.NoCache); context.Response.Cache.SetExpires (DateTime.Now.AddMinutes (-1)); context.Response.Cache.SetNoStore(); context.Response.Cache.SetNoServerCaching(); Queste sono le mie modifiche a Response.Cache; La ciambella sembra ignorarli e conservarli tutti in ogni caso. – Dusda
Ho spostato le visualizzazioni di pagina su una chiamata ajax, invece di confondermi con VaryByCustom. Tuttavia, la risposta fornita è un'ottima soluzione a questo problema. Grazie: D. – Dusda