2012-12-15 11 views
6

Ho un'azione ASP.NET MVC decorata con l'attributo OutputCache, ma il problema è che l'output di MiniProfiler è anche memorizzato nella cache. Vorrei escludere l'output di MiniProfiler dalla cache (foro della ciambella), ma non sono sicuro di come escludere una chiamata come MiniProfiler.RenderIncludes().Caching foro ciambella - escludere MiniProfiler.RenderInclude

Chiunque capisca come posso farlo?

+1

Ha importanza? Se la pagina proviene dalla cache di output, l'azione e il controller non vengono chiamati così profiler non mostrerebbero comunque niente, no? – Aliostad

+0

Questo è davvero un buon punto per il lato server, ma MiniProfiler fornisce anche informazioni sul tempo di caricamento nel DOM ecc. Che sarebbe interessante. – larsw

risposta

6

Questo è un punto importante se si utilizza MiniProfiler in produzione. Come se la prima visita ad una pagina fosse da parte di un utente in cui MiniProfiler è abilitato, tutte le richieste successive includeranno i risultati di MiniProfiler nel DOM (così come sono ora memorizzati nella cache). Non solo i risultati saranno errati (poiché considerano solo il primo caricamento), ma tutti i visitatori potranno vedere i risultati del tuo MiniProfiler.

In primo luogo, per consentire ciambella buco caching, sto facendo uso di:

http://mvcdonutcaching.codeplex.com/

Ciò consente di aggiungere le azioni che non verranno memorizzati nella cache quando si utilizza l'OutputCache.

Dato quanto sopra, è possibile rimuovere @using StackExchange.Profiling; dalla pagina Layout. È quindi possibile sostituire:

@MiniProfiler.RenderIncludes() 

Con:

@Html.Action("MiniProfiler", "DoNotCache", excludeFromParentCache: true) 

ho creato un controller DoNotCache, così tutti i miei elementi non memorizzabili nella cache sono insieme, ma questo non è richiesto e si può mettere questa azione in qualsiasi controller

public ActionResult MiniProfiler() 
{ 
     return View(); 
} 

E poi la vista stessa sembra proprio come:

@using StackExchange.Profiling; 
@{ 
    Layout = null; 
} 
@MiniProfiler.RenderIncludes() 

Questo assicurerà i risultati MiniProfiler vengono visualizzati quando appropriato, e non venga la produzione anche in luoghi in cui si usa il DonutOutputCache annotazione.

+0

Grazie - lo esaminerò di nuovo. – larsw