Output Cache Substitution (Donut Caching) in ASP.NET MVC 2 en 3
This post was originally published on Coding Glamour.
Dynamische pagina's, of het nou in PHP, CGI of .NET is, hebben het
internet gemaakt tot wat het nu is; maar hebben één groot nadeel.
Voor elk request dient de pagina opnieuw te worden gegenereerd. Oplossing:
cachen. Nu hebben we hiervoor in ASP.NET MVC het 'OutputCache'
attribuut, dat je op elke Action kan zetten:
Probleem
Iedereen die deze pagina de komende minuut opvraagt krijgt dezelfde versie
te zien. Geen probleem voor pagina's die more-or-less statisch zijn,
maar funest wanneer je bijvoorbeeld login informatie toont! Voeg je bijvoorbeeld
Output caching toe aan het standaard ASP.NET MVC 2 project (In VS 2010
-> New Project -> ASP.NET MVC 2 Web Application) dan krijg je de
volgende situatie:
Overzichtspagina, je ziet de 'last update' datum ter referentie
Nu loggen we in
De pagina wordt uit cache geladen (zie 'last update') maar er staat nog steeds een 'Log on' knop ipv. 'Logged in as jan'.
Oplossing?
De techniek om een hele pagina te cachen behalve een of meerdere
kleine stukjes heet 'Output Cache Substitution' of 'Donut
Caching', maar dit zou in MVC 2 en MVC 3 niet meer mogelijk zijn. Dat roept om een uitdaging!
Daarom...
Alvast een sneak preview van een project dat ik binnenkort hoop te open
sourcen, dat Donut Caching toevoegd aan ASP.NET MVC.
Maak een nieuwe controller 'SharedController' aan in het standaard
MVC project, met daarin de actie 'Datum'.
In de view die hierbij hoort outputten we de huidige datum & tijd:
We kunnen nu de datum tonen (en dus controleren of er gecachet wordt)
door in de Shared/Site.master de regel toe te voegen:
Elke keer dat je de pagina nu refresht zie je dat de datum verandert.
Caching aanzetten
Ook hier werken we weer met een attribuut dat je moet toevoegen aan je
Action, met de naam (subject to change) 'ActionRenderOptimizer':
Wanneer je nu de homepage opvraagt zie je dat de datum steeds hetzelfde
blijft. Deze zit namelijk in cache.
Deel van de pagina niet cachen?
Wanneer je nu een deel van je pagina niet wil cachen, vervang je de 'Html.RenderAction'
door 'Html.RenderDonutAction'. Om dit te verifieren vervang je
de regel in je masterpage door:
Roep je nu de pagina op, dan zie je dat een van de twee datums elke keer
opnieuw wordt gegenereerd!
Eerste request
Tweede request
Binnenkort te downloaden
Binnenkort te vinden op CodePlex!
There are 2 comments on this article, read them on Coding Glamour.