Monday, October 5, 2009

Caching - Output Caching

Tramite l'Output Caching, quando una pagina viene richiesta per la seconda volta, non verrà ricreata, il page life cycle non partirà e nessuna parte del codice verrà eseguita; invece verrà presa la copia in cache e verrà mandata al client.
Non avremo bisogno di preoccuparci delle altre risorse statiche che sono contenute in una pagina ASP.NET (come le immagini).
IIS automaticamente creare una copia in cache di questi files; e lo fa meglio della cache di ASP.NET.

Creiamo una pagina ASP.NET di questo tipo:

<form id="form1" runat="server">
<div>
<asp:Label runat="server" ID="lblDate" />
</div>
</form>


E code-behind:

protected voidPage_Load(objectsender,EventArgse)
{
lblDate.Text ="Tempo:";
Text +=DateTime.Now.ToString();
}


 
Ad ogni refresh che eseguirete, la label lblData verrà aggiornata.
Abbiamo due modi per attivare la cache su questa pagina.
La più utilizzata è quella di inserire la seguente proprietà nel file .aspx subito dopo la direttiva Page:

<%@ OutputCache Duration="20" VaryByParam="None" %>

Avendo specificato la Duration a 20 secondi, la pagina non verrà aggiornata se non allo scadere del ventesimo secondo. 
Il parametro VaryByParam lo vedremo successivamente.

20 Secondi oggi giorno potrebbero sembrare un'eternità.
Ma pensate, ad esempio, d'avere un elenco di prodotti da far vedere ogni volta che un utente si collega.
Così facendo riusciamo a limitare le connessioni al database, non di poco.

Durante lo sviluppo quando ricompilerete il vostro progetto, le pagine in cache verranno automaticamente rimosse.
Comunque è sempre meglio disabilitare il caching durante la fase di test, in modo da poter debuggare la vostra pagina.



Query String


Ritorniamo al parametro VaryByParam.
Ipotiziamo d'avere una pagina che in base alla query string varia la visualizzazione dei dati.
In questo caso il Fragment Caching farebbe a caso nostro.

Ma facciamo finta d'avere una pagina che ricerve informazioni da un'altra pagina.
Come abbiamo visto prima, settando a None la direttiva VaryByParam, la pagina viene aggiornata solamente allo scadere del tempo.
Invece settando la proprietà con * l'effetto cambierà:



<%@ OutputCache Duration="20" VaryByParam="*" %>

Provate di nuovo a fare il refresh della pagina, vedrete che la pagina continuerà a esser aggiornata solamente ogni 20 secondi.
Provate a modificare l'indirizzo nel vostro browser, ad esempio, così:

Default.aspx?a=valore

La pagina verrà aggiornata, prima dello scadere dei 20 secondi.
Se provate a richiedere di nuovo la pagina con 'a=valore' vedrete che questa verrà aggiornata solamente allo scadere dei 20 secondi.
Praticamente ASP.NET avrà creato una copia in cache di quella pagina.
Nella direttiva VaryByParam possiamo specificare i Parametri che ci aspettiamo affinchè la pagina possa venire copiata in cache:


<%@ OutputCache Duration="20" VaryByParam="ProductID" %>


Se vi aspetterete più di un parametro, basterà dividerli da un ;

<%@ OutputCache Duration="20" VaryByParam="ProductID;Type" %>

Custom Caching Control

Un'altra possibilità che da ASP.NET per copiare in cache le pagine è data dalla proprietà VaryByCustom.
Ipotiziamo di volere una pagina in cache per ogni browser, setteremo così le direttive nella pagina che ci interessa:
Fatto questo nel nostro Global.asax aggiungermo la seguente funzione:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom = "browser")
{
string browserName = Context.Request.Browser.Browser;
browserName += Context.Request.Browser.MajorVersion.ToString();
return browserName;
}
else
{
return base.GetVaryByCustomString(context, custom);
}
}
 
Qualcosa di simile possiamo farlo basandoci sull'header del browser:
<%@ OutputCache Duration="20" VaryByParam="None" VaryByHeader="Accept-Language" %>
 
In modo tale da avere in cache una copia per ogni lingua.

No comments:

Post a Comment