Memorizzazione nella cache di parti di una pagina ASP.NET

Talvolta la memorizzazione nella cache di una pagina intera risulta poco pratica, in quanto per ciascuna richiesta è possibile che le parti di pagina necessarie varino. In questi casi, è possibile memorizzare solo una parte della pagina. A questo scopo sono disponibili due opzioni: la memorizzazione nella cache del controllo e la sostituzione post-cache.

La memorizzazione nella cache del controllo, anche detta memorizzazione nella cache a livello di frammento, consente la memorizzazione di parti dell'output di pagina tramite la creazione di controlli utente che includono il contenuto da gestire tramite cache e che vengono quindi contrassegnati come memorizzabili. Questo consente la memorizzazione nella cache di contenuto specifico all'interno di una pagina, mentre la pagina globale viene ricreata ogni volta. Se, ad esempio, si crea una pagina che visualizza contenuti in gran parte dinamici, come quotazioni azionarie, ma include anche sezioni statiche, ad esempio riepiloghi settimanali, è possibile creare tali sezioni statiche nei controlli utente e configurarli come memorizzabili.

La sostituzione post-cache rappresenta il processo opposto. La pagina viene memorizzata nella cache, ma i frammenti al suo interno sono dinamici e quindi non devono essere memorizzati. Se si crea una pagina totalmente statica per determinati periodi di tempo, ad esempio una pagina di notizie, è possibile impostare l'intera pagina come memorizzabile. Se si aggiungono alla pagina memorizzata nella cache banner pubblicitari a rotazione, essi non cambieranno tra una richiesta della pagina e l'altra. Tuttavia, con questo metodo, è possibile memorizzare nella cache la pagina e contrassegnarne parti specifiche come non memorizzabili. Nell'esempio, i banner pubblicitari verranno contrassegnati come tali. Di conseguenza, i banner verranno creati dinamicamente per ogni richiesta di pagina e aggiunti all'output della pagina memorizzata. Per ulteriori informazioni sulla sostituzione post-cache, vedere Aggiornamento dinamico di parti di una pagina memorizzata nella cache.

Memorizzazione nella cache dei controlli

La creazione di controlli utente per la memorizzazione dei contenuti nella cache consente di separare le parti di una pagina la cui creazione richiede un tempo di elaborazione del processore prolungato, ad esempio le query di database, dalle altre parti. Per le parti della pagina che richiedono minori risorse dal server è possibile impostare la generazione dinamica a ogni richiesta.

Dopo aver identificato le parti della pagina da memorizzare nella cache e aver creato i controlli utente che le contengono, è necessario determinare i criteri di memorizzazione nella cache per i controlli utente. È possibile impostare questi criteri in modo dichiarativo utilizzando la direttiva @ OutputCache oppure la classe PartialCachingAttribute nel codice per il controllo utente.

Se, ad esempio, si include la direttiva che segue nella parte iniziale di un file di controllo utente (con estensione ascx), una versione del controllo verrà memorizzata nella cache di output per 120 secondi.

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

Se si desidera impostare nel codice i parametri di memorizzazione nella cache, è possibile utilizzare un attributo nella dichiarazione della classe del controllo utente. Se, ad esempio, si include il seguente attributo nei metadati della dichiarazione di classe, una versione del controllo viene memorizzata nella cache di output per 120 secondi.

[PartialCaching(120)]
public partial class CachedControl : System.Web.UI.UserControl
{
    // Class Code
}
<PartialCaching(120)> _
Partial Class CachedControl
    Inherits System.Web.UI.UserControl
    ' Class Code
End Class

Per ulteriori informazioni sugli attributi che è possibile impostare per l'output della pagina, vedere l'argomento @ OutputCache. Per ulteriori informazioni sullo sviluppo dei controlli utente, vedere Cenni preliminari sui controlli server Web ASP.NET.

Nota

Poiché i controlli utente possono essere nidificati in una pagina, anche i controlli utente collocati nella cache di output possono essere nidificati. È possibile specificare impostazioni della cache diverse per la pagina e per i controlli utente nidificati.

Riferimento ai controlli utente memorizzati nella cache a livello di codice

Quando si crea un controllo utente memorizzabile in modo dichiarativo, è possibile includere un attributo ID per fare riferimento a tale istanza del controllo utente a livello di codice. Tuttavia, prima di fare riferimento al controllo utente nel codice, è necessario verificare l'esistenza del controllo utente nella cache di output. Un controllo utente memorizzato nella cache viene generato dinamicamente solo alla prima richiesta. Tutte le richieste successive verranno soddisfatte dalla cache di output fino alla scadenza specificata. Dopo aver constatato l'esistenza di un'istanza del controllo utente, sarà possibile modificarla a livello di codice dalla pagina che lo contiene. Se, ad esempio, si assegna in modo dichiarativo a un controllo utente una proprietà ID di SampleUserControl, è possibile verificarne l'esistenza mediante il codice seguente:

protected void Page_Load(object sender, EventArgs e)
{
    if (SampleUserControl != null)
       // Place code manipulating SampleUserControl here.
}
Protected Sub Page_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Me.Load
    If SampleUserControl <> Nothing Then
       ' Place code manipulating SampleUserControl here.
    End If
End Sub

Memorizzazione nella cache della pagina e dei controlli utente per durate diverse

È possibile impostare valori di durata della cache di output diversi per una pagina e per i controlli utente sulla pagina. Se la durata della cache di output della pagina è maggiore della durata della cache di output del controllo utente, la durata della cache di output della pagina avrà la precedenza. Se ad esempio la memorizzazione nella cache di output della pagina è impostata su 100 secondi, mentre quella del controllo utente è impostata su 50 secondi, l'intera pagina, compreso il controllo utente, verrà memorizzata nella cache di output per 100 secondi, indipendentemente dal fatto che l'impostazione per il controllo utente sia inferiore.

Nell'esempio di codice riportato di seguito viene mostrato l'effetto della memorizzazione nella cache di una pagina per una durata superiore rispetto a quella di un controllo utente. La durata della memorizzazione della pagina è impostata su 100 secondi.

<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>

<SampleControl:Time runat="server" /><br /> <br /> <br />

This page was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>

<SampleControl:Time runat="server" /><br /> <br /> <br />

This page was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

Nell'esempio di codice riportato di seguito viene illustrato il controllo utente incluso nella pagina. La durata della memorizzazione nella cache per il controllo è impostata su 50 secondi.

<% @Control language="C#" %>
<% @OutputCache duration="50" varybyparam="none" %>

This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="50" varybyparam="none" %>

This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

Se la durata della memorizzazione nella cache di output della pagina è inferiore a quella del controllo utente, il controllo utente verrà memorizzato nella cache fino alla scadenza, anche quando il resto della pagina venga rigenerato in conseguenza di una richiesta. Se ad esempio la memorizzazione nella cache di output della pagina è impostata su 50 secondi, mentre quella del controllo utente è impostata su 100 secondi, il controllo utente scadrà solo una volta ogni due scadenze del resto della pagina.

Il seguente codice mostra il codice per una pagina che include il controllo utente con una durata della cache superiore a quella della pagina. La durata della memorizzazione della pagina è impostata su 50 secondi.

<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>

<SampleControl:Time runat="server" /><br /> <br /> <br />

This page was most recently generated at:<p>
 <% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="Uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>

<SampleControl:Time runat="server" /><br /> <br /> <br />

This page was most recently generated at:<p>
 <% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

Il codice seguente mostra il controllo utente incluso nella pagina. La durata della memorizzazione nella cache per il controllo è impostata su 100 secondi.

<% @Control language="C#" %>
<% @OutputCache duration="100" varybyparam="none" %>

This user control was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="100" varybyparam="none" %>

This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

Vedere anche

Concetti

Cenni preliminari sull'inserimento nella cache in ASP.NET
Aggiornamento dinamico di parti di una pagina memorizzata nella cache
Memorizzazione nella cache di più versioni di una pagina
Memorizzazione nella cache dei dati dell'applicazione
Novità della memorizzazione nella cache in ASP.NET
Configurazione della cache in ASP.NET