ASP.NET 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 void Page_Load(object sender, EventArgs e)
        {
            lblDate.Text = "Tempo:<br/>";
            lblDate.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:

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

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.

ASP.NET Caching - Introduzione, parte 2

ASP.NET da ha disposizione due tipi fondamentali di caching che le applicazioni possono/devono usare in quanto complementari:

  • Output caching: Il tipo più semplice. 
    Registra la copia della pagina HTML che viene mandata al client.
    Il client successivo che richiederà la pagina riceverà la copia in memoria.

    outputcache

  • Data caching: Questo tipo di cache sarà implementato nel nostro codice.
    Registreremo nella cache importanti informazioni le quali richiedono grosse quantità di tempo per essere ricreate.
    Le altre pagine potranno controllare se questi dati esistono in cache e usarli.
    Il concentto alla base di questo tipo di cache è quello dell'application state, con la differenza che, la cache, è più server-friendly perchè i dati verranno rimossi automaticamente quando richiederanno troppe risorse oppure quando scadranno (vedremo come si setta la data di scadenza).

Oltre a questi due tipi fondamentali, abbiamo a nostra disposizione altri due modelli che si basano su quelli fondamentali:

  • Fragment caching: Si basa sul modello Output caching; ma a differenza di questo ci permette di tenere in cache porzioni (user control) della pagina HTML renderizzata.

  • Data source caching: Questo tipo di caching è integrato nel data source control integrato (SqlDataSource, ObjectDataSource e XmlDataSource).
    Tecnicamente è uguale al Data caching. La differenza è che non avremo bisogno di gestire i processi; dovremo solamente configurare le opportune proprietà.

ASP.NET Caching - Introduzione, parte 1

A volte ci troviamo con applicazioni mal strutturate che iniziano a soffrire, sin da subito o con l'andare del tempo, sotto l'aspetto prestazionale e di scalabilità.

Ciò si traduce in applicazioni così lente che perderanno alcuni secondi, se non minuti, prima d'esser completamente renderizzate dal nostro browser.

Solitamente ciò capita perchè nel nostro applicativo ci sono dei colli di bottiglia difficili da evitare.

La bellezza del caching, a differenza di tante altre tecniche, è l'alto livello di performance e scalabilità.

Le Performance miglioreranno perchè il tempo impiegato per la richiesta delle informazioni sarà drasticamente diminuito.

La Scalabilità è migliorata perchè lavoreremo attorno quei colli di bottiglia che possono essere, ad esempio, le connessioni al database.

Ovviamente non è tutto oro ciò che luccica.
Bisogna sempre tener presente che la memoria dei server è limitata e, se iniziamo a tenere in memoria troppe informazioni, riempiremo la ram e parte delle informazioni verranno registrate nel disco e rallenteremo l'intero sistema.

Per fortuna ASP.NET ci viene incontro tenendo un tempo massimo di vita delle informazioni a discrezione del server.

Se le informazioni in cache saranno troppe o un'applicazione consumerà troppa memoria, le informazioni verranno selettivamente cancellate dalla cache, mantenendo così le performance.

Con ASP.NET possiamo tenere in cache (e vedremo come):

  • un'intere pagina html
  • parte di una pagina html
  • risorse varie

Possiamo anche modificare le policy per rendere i dati in cache non più disponibili e le policy affinchè vari oggetti possano essere cancellati dalla memoria nel momento in cui vengono a mancare delle dipendenze.