Caching in ASP.net (1/2)
Data di pubblicazione: 28/11/2006
Voto della community: 4,33
(Votanti: 7)
In informatica il termine Caching indica la tecnica comunemente utilizzata per velocizzare le operazioni di accesso ai dati. Tale tecnica consiste nell'immagazzinare i dati e le informazioni in luoghi di più facile e più rapido accesso di quanto non fosse possibile fare se restassero nella loro locazione originaria.
Nello sviluppo di applicazioni per il web, il Caching di solito viene applicato alle informazioni provenienti da un database. A tal proposito l'ASP tradizionale offre pochissimo supporto. Una delle tecniche più utilizzate dagli sviluppatori ASP per mettere in Cache, ad esempio, il risultato di una query ad un database è l'utilizzo delle variabili Application, con tutti i problemi che esse comportano (pensiamo ad esempio al Lock dell'oggetto Application). Con ASP.NET la situazione è cambiata notevolmente. Infatti il Framework .NET mette a disposizione una serie di classi sviluppate ad hoc che permettono di gestire in maniera molto semplice ed efficace tutto quello che riguarda il Caching. ASP.NET prevede diversi meccanismi di caching al suo interno. Alcuni meccanismi sono interni al Framework .NET (ed ovviamente al CLR) ed automatici (quindi trasparenti per lo sviluppatore). Si tratta dei cosiddetti internals del Framework .NET. A tal proposito distinguamo:
Caching delle pagine
Questo meccanismo riguarda essenzialmente la compilazione (e la ricompilazione) delle pagine ASPX. Cosa succede quando una pagina ASPX viene richiesta? Se la pagina viene richiesta per la prima volta, il CLR (Common Language Runtime) compila "al volo" la pagina e la salva in un oggetto temporaneo (assembly) su disco. A questo punto l'assembly viene eseguito in memoria. Alle successive richieste verrà eseguita la versione della pagina in memoria. Se la pagina venisse modificata e in memoria fosse presente una "vecchia" versione della pagina, il CLR "invalida" la pagina in memoria e procede con la ricompilazione delle nuova versione della pagina. Questo meccanismo di Caching spiega anche il perchè della lentezza di risposta del server alla prima richiesta di ogni pagina ASPX. Tutto questo è possibile grazie alla classe FileSystemWatcher di cui si avvale il Framework .NET per monitorare le eventuali modifiche eseguite ai sorgenti dell'applicazione Web.
Caching della configurazione
Per il Caching della configurazione vale lo stesso discorso fatto per il Caching delle pagine ASPX. In questo caso, però, il ciclo parte la prima volta che un'applicazione web viene eseguita, ovvero, la prima volta che una qualunque pagina ASPX viene richiesta in una directory virtuale. Anche il web.config viene monitorato costantemente con l'ausilio del FileSystemWatcher ed eventuali modifiche al file determinano l'invalidazione della Cache e la ricompilazione del file modificato.
Caching dell'output
Il caching dell'output non è un meccanismo automatico, ma deve essere abilitato esplicitamente (attraverso opportuna direttiva) dallo sviluppatore. Con questo meccanismo è possibile mettere in Cache l'output HTML generato dalle pagine ASPX o, come vedremo in seguito, dai controlli utente. Il Caching dell'output è molto utile quando si hanno delle pagine ASPX "statiche", vale a dire quando si è certi che il contenuto della pagina ASPX non cambierà mai o cambierà molto poco frequentemente.
Abilitare la cache per l'output è molto semplice. Tutto quello che serve è abilitare la direttiva "OutputCache" nella pagina ASPX nel modo seguente:
<%@ Page Language="VB"%>
Esempio 1 - Caching dell'output semplice
<%@ Page Language="VB"%> Esempio 2 - Caching di versioni multiple di una pagina ASPX in base ai parametri (form o querystring)
<%@ Page Language="VB"%> Esempio 3 - Caching di versioni multiple di una pagina ASPX in base al browser
<%@ Page Language="VB"%> Caching frammentato
La direttiva "OutputCache" può essere utilizzata anche nei controlli utente. L'abilitazione del caching nei controlli si ottiene nel modo seguente:
<%@ Control Language="VB"%> Consideriamo il caso di una pagina che visualizza in testa la data e l'ora corrente e al centro una lista di prodotti. Se venisse abilitato il caching per l'intera pagina, data e ora non verrebbero visualizzate in maniera corretta. Per risolvere il problema si potrebbe spostare la lista dei prodotti in un controllo utente ed abilitare solo qui la direttiva OutputCache, lasciando invece nella pagina ASPX la logica per la visualizzazione della data e dell'ora. E' bene qui ricordare che il tentativo di maneggiare un controllo in cache dal codice della pagina ASPX che lo contiene genererà un errore. Ad esempio il seguente codice non è assolutamente corretto, se per il controllo è stata abilitata la direttiva "OutputCache": <Acme:TestControl ProprietaXXX='<%# Container.DataItem("Prodotto") %>' runat="server" /> Questo accade perchè il controllo viene creato solo alla prima richiesta; alle successive richieste il controllo non sarà più disponibile e tutti i tentativi di accesso alle sue proprità e metodi falliranno miseramente. Per evitare questo problema, la logica di creazione del controllo dovrebbe essere inserita all'interno degli eventi Page_Load o Page_PreRender del controllo stesso.
|
||||||||||||||||||||||||