# Programmeren in ASP.NET/Caching
## Inleiding

Caching is het tijdelijk bewaren van gegevens, zodat bij de volgende aanvraag het resultaat sneller verstuurd kan worden.
Een voorbeeld: je wordt gevraagd een lijstje te maken van de 10 landen met de meeste inwoners. Na enig opzoekwerk kan je dat lijstje geven. Als men je nu tien minuten later vraagt om datzelfde lijstje nog eens te maken, dan ga je dat niet allemaal opnieuw opzoeken, maar je geeft gewoon een kopie van het vorige lijstje. Dat is caching. De server kan daardoor veel sneller een antwoord geven, en is daarenboven onmiddellijk weer vrij om een volgende aanvraag te beantwoorden.
Neem bijvoorbeeld een pagina met een GridView. Als er geen wijziging nodig is, en er zijn geen wijzigingen in de databank, dan verandert de pagina niet. Met caching kan dan dezelfde pagina (zelfde HTML) doorgestuurd worden, zonder dat alle code nogmaals moet uitgevoerd worden.
Caching wordt ook toegepast in andere computerdomeinen, zoals moederborden, harde schijven, besturingssystemen, enz.
In ASP.NET kan je met de juiste caching-instelling je pagina's veel sneller maken. Dit is vooral belangrijk bij zwaar belaste sites (veel hits of veel bezoekers).

## De soorten van caching in ASP.NET

ASP.NET ondersteunt drie soorten van caching:
| Output Caching | Tijdelijke bewaring van de output van een gehele pagina. Volgende aanvragen krijgen de pagina uit de cache in de plaats van de gehele pagina opnieuw uit te voeren |
| Fragment Caching | Tijdelijke bewaring van de deel van een pagina. Dit deel kan dan hergebruikt worden zelfs terwijl andere delen van de pagina nog aangemaakt worden. |
| Data Caching | Willekeurige objecten worden programmatisch bewaard voor hergebruik, zodat ze niet telkens moeten aangemaakt worden. |
Welk soort van caching je uiteindelijk gebruikt hangt af van je situatie, maar ze worden hieronder allemaal kort behandeld, zodat je een bewuste keuze kan maken.

### Output caching

Output caching is de eenvoudigste van de caching-opties aangeboden door ASP.NET. Het is nuttig wanneer een volledige pagina kan gecached worden als een geheel, en het komt overeen met de meeste caching-oplossingen die beschikbaar waren met klassiek ASP. Het neemt een dynamisch aangemaakte pagina en bewaart het HTML-resultaat net vooraleer het naar de client gezonden wordt. Dan hergebruikt het deze HTML voor toekomstige aanvragen zodat de oorspronkelijke code niet moet uitgevoerd worden.
ASP.NET vertellen dat een pagina caching moet gebruiken is zeer eenvoudig. Je voegt gewoon het OutputCache-directief toe aan de pagina die je wil in de cache plaatsen.
De caching die hieruit voortkomt gelijkt op de caching van browsers en proxy-servers, maar er is één zeer belangrijk verschil: je kan een pagina laten weten welke parameters in de pagina een effect zullen hebben op de output en de caching engine zal verschillende versies cachen gebaseerd op de parameters die je opgeeft. Dit kan je doen door het VaryByParam attribuut van de OutputCache directive te gebruiken. De code hieronder illustreert een zeer simpel voorbeeld van output caching:
caching1.aspx
Dit stuk code zal het resultaat cachen voor 30 seconden. Tijdens die periode zullen alle responses voor alle verzoeken voor de pagina vanuit de cache geleverd worden.
Hierdoor lijkt de tijdsaanduiding op de pagina stil te staan, en pas na 30 seconden kan je een andere tijd krijgen (als je de pagina ververst).
Het specificeert ook dat de caching moet variëren volgens de parameter "taal". Dan zal de pagina een verschillende versie cachen voor elke waarde van "taal" die in de url (querystring) doorgegeven wordt. Er wordt een verschillende versie teruggegeven afhankelijk van de waarde van "taal" in de binnenkomende aanvraag.
Als je dus de pagina caching1.aspx?taal=nl opvraagt, en vlak daarna caching1.aspx?taal=fr, dan wijzigt de tijd wel.
Dit betekent dat er zowel voor de waarde nl als voor de waarde fr een aparte pagina in de cache zal bijgehouden worden.

### Fragment caching

Soms het is niet mogelijk een gehele pagina te cachen. Bijvoorbeeld, veel shoppingsites willen hun gebruikers bij hun naam aanspreken. Het zou er niet erg professioneel uitzien als je een site bezoekt en je wordt begroet met een andere naam! In het verleden betekende dit dikwijls dat caching niet geschikt was voor dit soort pagina's. ASP.NET lost dit op met wat men fragment caching noemt. Deze naam is eigenlijk een beetje misleidend. Hoewel je technisch wel een deel van een pagina kan cachen, moet je daarvoor dit deel omzetten in een user-control en het OutputCache-directief in de nieuwe user-control aanzetten. Deze oplossing werkt wel, maar brengt een beetje extra werk mee. Het caching-gedeelte gelijkt erg op de code hierboven. Behalve het wijzigen van de sectie in een user-control en dan die user-control te gebruiken is er niet veel aan.

### Data-caching

Dit is de meest krachtige van de caching-opties beschikbaar in ASP.NET. Door data-caching te gebruiken kan je programmatisch alles cachen wat je wil voor zolang je wil. Het caching-systeem werkt met een woordenboek-formaat (dictionary). Dit betekent dat de items worden opgeslagen in paren: naam=waarde. Je cachet een item onder een bepaalde naam en wanneer je dan die naam opvraagt krijg je het item terug. Het lijkt op een array of zelfs op een eenvoudige variabele. Naast het plaatsen van een object in de cache kan je een hele reeks eigenschappen instellen. Het object kan ingesteld worden om te vervallen op een bepaalde datum en uur, na een bepaalde periode van inactiviteit, of wanneer een bestand of ander object in de cache gewijzigd wordt.
Waar je zeker op moet letten met data-caching is dat items die je in de cache plaatst niet gegarandeerd daar te vinden zijn als je ze weer opvraagt. Dit vraagt een beetje extra werk (je moet altijd je objecten controleren nadat je ze ophaalt), maar het is uiteindelijk een goede zaak dat de caching-engine de flexibiliteit heeft om zaken die niet gebruikt worden te dumpen, of om de cache leeg te maken als het systeem een tekort aan geheugen krijgt.
Hier is een eenvoudig voorbeeld van data-caching:
caching2.aspx

## Substitution-control (ASP.NET 2.0)

Zie ook http://fredrik.nsquared2.com/viewpost.aspx?PostID=85
Als je een bepaald onderdeel van een pagina uit de cache wil houden, dan kan je in ASP.NET 2.0 de Substitution-control gebruiken.
Deze control heeft een eigenschap MethodName. Deze verwijst naar een functie, die als resultaat een string moet geven. Deze string wordt door de control getoond in de pagina.
Hier is een voorbeeld dat de datum toont:

## Besluit

Caching is een gemakkelijke manier om je webpagina's en applicaties sneller te maken en het kost je echt geen moeite, behalve een beetje tijd om uit te zoeken wat je moet cachen en voor hoe lang. Het verbruikt wel een beetje geheugen, maar met de huidige prijs van geheugen is dat een kleine prijs die je betaalt voor een snellere website.