Home Page Home Page Articoli Caching di pagine ASP.NET

Caching di pagine ASP.NET

Quando si ha a che fare con l'ingegnerizzazione di un programma la gestione del cache è una cosa importante. La "cache" e' un'area molto veloce (di solito la RAM) dove vengono copiati i dati che necessitano di essere disponibili nel piu breve tempo possibile. Vediamo com'è possibile gestire la Cache in ASP.NET
Autore: Matteo Raumer Livello:
Le pagine ASP, che sono pagine dinamiche, spesso vengono generate interrogando una fonte dati o eseguendo molto codice, cio' comporta che ad ogni richiesta (anche il refresh) del browser, vengano rieseguite query, IO su file o codice molto complesso.Tutto questo per un numero di volte che potenzialmente potrebbe essere altissimo, spesso per generare un output che non varia per giorni, con conseguenti sovraccari inutili del database, del disco o del traffico di rete.
Per evitare questi sprechi e dare un "boost" alle pagine si deve ricorrere alla cache, anche perche' la struttura stessa del "worker process" (ovvero il task "aspnet_wp.exe") che gestisce asp.net in iis, guarda se i contenuti da elaborare sono da prendere dalla cache prima di compilare e restituire il risultato.Ecco che se pagine, o parti di esse, si trovano "gia pronte" le operazioni si velocizzano.
Per dire al worker process che il contenuto di tutta la pagine deve essere messo in cache per le chiamate successive basta aggiungere la direttiva "OutputCache" alla pagina:

<%@ OutputCache duration="10" VaryByParam="none" %>

con dei parametri obbligatori:
- durata in secondi
- motivo per cui si deve ricostruirla ugualmente anche se nell'intervallo di tempo.

Sono presenti anche altri parametri come VaryByHeader, VaryByCustom, VaryByControl ma per momento consideriamo solo VaryByParam che e' il piu "facile".

Nel caso precedente specificando "none" non ricostruisce mai la pagina se non dopo che siano trascorsi i 10 secondi.Questo parametro è molto utile perche' si puo impostare la cache molto alta, e dire alla pagina che venga rielaborata se varia un parametro postato per esempio:

...VaryByParam="none"%> <-- mai, verra ricreata solo allo scadere della duration
...VaryByParam="*"%> <-- per tutti le variabili "postate"
...VaryByParam="textbox1"%> <-- se varia solo il contenuto di textbox1 inviato con un submit
...VaryByParam="textbox1;textbox2"%> <-- almeno uno di questi

E tutto questo come per la pagina intera lo si puo fare anche per un webcontrol (che in effetti è una pagina un po particolare), creando l'effetto di "caching parziale" ovvero di solo alcune parti della pagina come nell'esempio in figura:



dove il codice che restituisce la data e ora, una parte lo esegue ad ogni refresh, mentre quella sottostante, della stessa pagina solo quando stabilito.

A volte potrebbe essere piu comodo decidere la durata della cache da codice, e si puo fare in questo modo:

private void Page_Load(object sender, System.EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.Server);
Response.Cache.SetExpires(System.DateTime.Now.AddSeconds(10));
Response.Cache.VaryByParams["textbox1"] = true;
...

che fa le stesse cose del metodo precedente.


Oppure si puo scegliere di utilizzare l'oggetto cache del framework che permette delle cose molto sofisticate come:
Decidere la priorita' dell'oggetto che si sta aggiungendo alla cache.
Infatti quando si necessita di rilasciare risorse del server, la cache comincia ad essere via via svuotata, percio si puo dare una priorita o dire di non rimuoverlo mai.
L'enum e' System.Web.Caching.CacheItemPriority da passare al metodo Cache.Insert

Far si che un elemento debba essere rimosso dalla cache se varia un file su disco
MioPath = Server.MapPath("clienti.xml");
Cache.Insert("clienti",ds,new System.Web.Caching.CacheDependency(MioPath));

Oppure se varia un'altro elemento in cache:
string[] MioNome = {"miooggetto"};
System.Web.Caching.CacheDependency miaDep = new System.Web.Caching.CacheDependency(null,MioNome);
Cache.Insert("data",DateTime.Now.ToString(),miaDep);
dove viene aggiunta la stringa "data" che varia se varia il valore di "miooggetto"(quindi anche se rimosso e ricreato uguale [o reinserito di nuovo])

Farsi dare una callback appena l'elemento viene rimosso :
MioDelegato = new CacheItemRemovedCallback(this.Cancellato);
Cache.Insert("clienti",ds,new CacheDependency(null,MiaStringa),Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration,CacheItemPriority.Normal,MioDelegato);


Addirittura si puo cachare quello che restituisce un metodo di un WebService:
[WebMethod(CacheDuration=10)]
public string MiaFunzione()
{
....


Per le applicazioni win32 il caching dei dati e' "quasi intrinseco" dato che si utilizzano classi molto potenti come il dataset o i datatable,dove solitamente si parcheggiano i dati gestendo opportunamente la sincronizzazione con la fonte dati.
Di solito si sceglie di tenere fissi per tutto il tempo di vita del programma i dati che variano poco spesso come alcuni settaggi di configurazione del programma o profili utente che solitamente vengono caricati solo all'avvio. Tuttavia anche per queste applicazioni ci sono delle considerazioni da fare sullo "strato" dell'applicazione dove agire con la cache, che all'aumentare della mole dati potrebbe incidere sulle prestazioni.


Pro: rapidita di caricamento della pagina, meno accessi su disco spesso inutili, riduzione del tempo di elaborazione cpu

Contro: bisogna fare un'attenta valutazione dei contenuti e dei tempi poiche' potrebbero non essere disponibili dati aggiornati nel momento necessario
Voto medio articolo: 4.0 Numero Voti: 6

File allegati


98_caching.zip (26 Kbyte)
Matteo Raumer

Matteo Raumer

Laurea breve in Ingegneria Elettronica presso l'Universita di Padova nel 2001, e nel febbraio 2009 un'altra triennale in Ingegneria Informatica. Da anni lavoro come programmatore .NET principalmente in C#, per migrare applicativi win32 in applicazioni ASP.NET. Ho sviluppato inoltre parecchia reportistica su Crystal Re... Profilo completo

Articoli collegati

Utilizzare controlli lato server in un Datagrid
Il DataGrid è un controllo molto avanzato spesso usato in ASP.NET. La maggior parte degli sviluppatori utilizza le funzioni basilari. E' possibile però estenderlo utilizzando controlli server aggiuntivi all'interno delle celle. Vediamo un esempio con una Combo Box.
Autore: Luca Graziani | Difficoltà: | Commenti: 6 | Voto:
Utilizzare il Tracing in ASP.NET
Scopriamo in questo articolo il servizio di analisi di ASP.NET che permette di controllare e analizzare le richieste web, consentendo di scrivere nel log del servizio di analisi in modo da effettuare a runtime una sorta di debug dell'applicazione Web.
Autore: Marco Caruso | Difficoltà: | Commenti: 1 | Voto:
Spedire messaggi SMS con .NET
Spiegheremo in questo articolo alcune tecniche per inviare messaggi SMS tramite .NET: invio tramite Web Service, invio diretto tramite cellulare oppure invio tramite un SMS Gateway. Presente anche un esempio pratico di invio con ASP.NET e Web Service.
Autore: David De Giacomi | Difficoltà: | Commenti: 9
Utilizzare il Web Service dei SQL Reporting Services da una pagina ASP.NET
Vedremo in questo articolo un altro modo di utilizzo dei Reporting Services. Mostreremo infatti come consumare il Web Service offerto dai RS per esportare i Reports in vari formati (XML, Excel, PDF, HTML, CSV) e visualizzarli in una pagina ASP.NET.
Autore: Marco Caruso | Difficoltà: | Commenti: 1 | Voto:
Visualizzare gerarchicamente i dati con una speciale DataGrid
La rappresentazione grafica di dati gerarchicamente connessi tra loro può essere realizzata anche con l'ausilio di un free control, creato da Denis Bauer, ottenendo un risultato veramente ottimo sia dal punto di vista grafico sia da quello funzionale.
Autore: Andrea Bersi | Difficoltà: | Commenti: 1 | Voto:
Mobile Web Forms e compatibilità tra Device
Ecco un articolo che illustra la creazione di una pagina mobile, tenendo conto delle compatibilità tra vari Device mobili.
Autore: Giovanni Ferron | Difficoltà:
DataSet, CreateChildView, e DataRelation: usare DataGrid per visualizzare dati da 2 tabelle
Un semplice e chiaro esempio per sfruttare al meglio il controllo DataGrid, per la visualizzazione di dati provenienti da 2 tabelle diverse, ma collegate fra loro. Viene spiegato come utilizzare il DataSet per creare delle relazioni tra le tabelle in esso contenute.
Autore: Andrea Bersi | Difficoltà: | Commenti: 1 | Voto:
Paginare un Datalist utilizzando il metodo ReadXml della classe Dataset
Il controllo DataGrid è uno strumento molto completo, ma che a volte può risultare troppo complesso in base alle esigenze della nostra applicazione. In questo articolo verrà spiegato come utilizzare al massimo il controllo DataList, anch'esso ottimo visualizzatore di dati, utilizzando però un'origine dati in formato XML, implementandone la paginazione.
Autore: Matteo Raumer | Difficoltà:
Come paginare un DataList
In questo articolo viene spiegato come paginare un DataList, grazie all'aiuto di stored procedure e al supporto per il paging offerto dal controllo stesso. Per ottenere una paginazione veloce, leggera, e personalizzabile al massimo.
Autore: Loris Badii | Difficoltà: | Commenti: 2 | Voto:
Ridimensionare al volo le immagini uploadate sul server, per creare le ThumbnailImages.
Molto spesso ci capita di voler visualizzare un'anteprima di un'immagine che magari ha grosse dimensioni. In questo articolo verrà spiegato come creare le immagini ridimensionate senza perdita di qualità.
Autore: Valerio Fornito | Difficoltà: | Commenti: 6
Renderizzare automaticamente gli URL come links in formato HTML
Molto spesso ci capita di dover visualizzare nelle pagina web degli URL, letti magari dal DB, ma che non ci vengono visualizzati subito come link cliccabili dall'utente. In questo articolo verrà spiegato come automatizzare questo processo.
Autore: Valerio Fornito | Difficoltà: | Voto:
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5