Memorizzazione nella cache

di Microsoft

Una conoscenza della memorizzazione nella cache è importante per un'applicazione ASP.NET con prestazioni elevate. ASP.NET 1.x offre tre diverse opzioni per la memorizzazione nella cache; memorizzazione nella cache dell'output, memorizzazione nella cache dei frammenti e API della cache.

Una conoscenza della memorizzazione nella cache è importante per un'applicazione ASP.NET con prestazioni elevate. ASP.NET 1.x offre tre diverse opzioni per la memorizzazione nella cache; memorizzazione nella cache dell'output, memorizzazione nella cache dei frammenti e API della cache. ASP.NET 2.0 offre tutti e tre questi metodi, ma aggiunge alcune funzionalità aggiuntive significative. Sono ora disponibili diverse nuove dipendenze della cache e gli sviluppatori hanno ora la possibilità di creare dipendenze della cache personalizzate. Anche la configurazione della memorizzazione nella cache è stata migliorata significativamente in ASP.NET 2.0.

Nuove funzioni e caratteristiche

Profili cache

I profili cache consentono agli sviluppatori di definire impostazioni della cache specifiche che possono quindi essere applicate a singole pagine. Ad esempio, se sono presenti pagine che devono essere scadute dalla cache dopo 12 ore, è possibile creare facilmente un profilo della cache che può essere applicato a tali pagine. Per aggiungere un nuovo profilo della cache, usare la <sezione outputCacheSettings> nel file di configurazione. Di seguito, ad esempio, è riportata la configurazione di un profilo di cache denominato twoday che configura una durata della cache di 12 ore.

<outputCacheSettings>
    <outputCacheProfiles>
        <add name="TwoDay" duration="43200" />
    </outputCacheProfiles>
</outputCacheSettings>

Per applicare questo profilo della cache a una determinata pagina, usare l'attributo CacheProfile della direttiva @ OutputCache, come illustrato di seguito:

<%@ OutputCache CacheProfile="TwoDay" %>

Dipendenze della cache personalizzate

ASP.NET gli sviluppatori 1.x hanno gridato per le dipendenze della cache personalizzate. In ASP.NET 1.x, la classe CacheDependency è stata bloccata, impedendo agli sviluppatori di derivare le proprie classi da essa. In ASP.NET 2.0, tale limitazione viene rimossa e gli sviluppatori sono liberi di sviluppare le proprie dipendenze personalizzate della cache. La classe CacheDependency consente la creazione di una dipendenza della cache personalizzata in base a file, directory o chiavi della cache.

Ad esempio, il codice seguente crea una nuova dipendenza della cache personalizzata in base a un file denominato stuff.xml che si trova nella radice dell'applicazione Web:

System.Web.Caching.CacheDependency dep = new
    System.Web.Caching.CacheDependency(Server.MapPath("stuff.xml"));
Response.AddCacheDependency(dep);
Cache.Insert("key", "value");

In questo scenario, quando il file di stuff.xml viene modificato, l'elemento memorizzato nella cache viene invalidato.

È anche possibile creare una dipendenza della cache personalizzata usando le chiavi della cache. Usando questo metodo, la rimozione della chiave della cache invaliderà i dati memorizzati nella cache. L'esempio seguente illustra questi concetti.

// insert a value into cache that will serve
// as the cache key
Cache["CacheKey"] = "something";

// create an array of cache keys
string[] keys = new String[1];
keys[0] = "CacheKey";

CacheDependency dep = new CacheDependency(null, keys);

// insert an item into cache with a dependency on
// the above CacheDependency
Cache.Insert("Key", "Value", dep);

Per invalidare l'elemento inserito in precedenza, rimuovere semplicemente l'elemento inserito nella cache per fungere da chiave della cache.

// Remove the cache item that serves as the cache key
Cache.Remove("CacheKey");

Si noti che la chiave dell'elemento che funge da chiave della cache deve essere uguale al valore aggiunto alla matrice di chiavi della cache.

Polling-Based dipendenze della cache SQL (denominate anche dipendenze Table-Based)

SQL Server 7 e 2000 usano il modello basato sul polling per le dipendenze della cache SQL. Il modello basato sul polling usa un trigger in una tabella di database attivata quando i dati nella tabella cambiano. Tale trigger aggiorna periodicamente un campo changeId nella tabella di notifica che ASP.NET controlla periodicamente. Se il campo changeId è stato aggiornato, ASP.NET sa che i dati sono stati modificati e invalidano i dati memorizzati nella cache.

Nota

SQL Server 2005 può anche usare il modello basato sul polling, ma poiché il modello basato sul polling non è il modello più efficiente, è consigliabile usare un modello basato su query (illustrato più avanti) con SQL Server 2005.

Affinché una dipendenza della cache SQL usi il modello basato sul polling per funzionare correttamente, le tabelle devono avere notifiche abilitate. Questa operazione può essere eseguita a livello di codice usando la classe SqlCacheDependencyAdmin o tramite l'utilità aspnet_regsql.exe.

La riga di comando seguente registra la tabella Products nel database Northwind che si trova in un'istanza di SQL Server denominata dbase per la dipendenza della cache SQL.

aspnet_regsql -S dbase -ed -d Northwind -E -et -t Products

Di seguito è riportata una spiegazione delle opzioni della riga di comando usate nel comando precedente:

Opzione della riga di comando Scopo
-S server Specifica il nome del server.
-ed Specifica che il database deve essere abilitato per la dipendenza della cache SQL.
-d database_name Specifica il nome del database che deve essere abilitato per la dipendenza della cache SQL.
-E Specifica che aspnet_regsql deve usare autenticazione di Windows per la connessione al database.
-Et Specifica che si abilita una tabella di database per la dipendenza della cache SQL.
-t table_name Specifica il nome della tabella di database da abilitare per la dipendenza della cache SQL.

Nota

Sono disponibili altri commutatori per aspnet_regsql.exe. Per un elenco completo, eseguire aspnet_regsql.exe -? da una riga di comando.

Quando questo comando esegue le modifiche seguenti al database SQL Server:

  • Viene aggiunta una tabella AspNet_SqlCacheTablesForChangeNotification . Questa tabella contiene una riga per ogni tabella nel database per cui è stata abilitata una dipendenza della cache SQL.
  • Le stored procedure seguenti vengono create all'interno del database:
AspNet_SqlCachePollingStoredProcedure Esegue una query sulla tabella AspNet_SqlCacheTablesForChangeNotification e restituisce tutte le tabelle abilitate per la dipendenza della cache SQL e il valore di changeId per ogni tabella. Questa stored proc viene usata per il polling per determinare se i dati sono stati modificati.
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure Restituisce tutte le tabelle abilitate per la dipendenza della cache SQL eseguendo una query sulla tabella AspNet_SqlCacheTablesForChangeNotification e restituisce tutte le tabelle abilitate per la dipendenza della cache SQL.
AspNet_SqlCacheRegisterTableStoredProcedure Registra una tabella per la dipendenza della cache SQL aggiungendo la voce necessaria nella tabella di notifica e aggiunge il trigger.
AspNet_SqlCacheUnRegisterTableStoredProcedure Annulla la registrazione di una tabella per la dipendenza della cache SQL rimuovendo la voce nella tabella di notifica e rimuove il trigger.
AspNet_SqlCacheUpdateChangeIdStoredProcedure Aggiornamenti tabella di notifica incrementando il valore changeId per la tabella modificata. ASP.NET usa questo valore per determinare se i dati sono stati modificati. Come indicato di seguito, questa stored proc viene eseguita dal trigger creato quando la tabella è abilitata.
  • Viene creato un trigger SQL Server denominato table_name_AspNet_SqlCacheNotification_Trigger per la tabella. Questo trigger esegue il AspNet_SqlCacheUpdateChangeIdStoredProcedure quando viene eseguita un'istruzione INSERT, UPDATE o DELETE nella tabella.
  • Al database viene aggiunto un ruolo SQL Server denominato aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess.

Il ruolo aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess SQL Server dispone delle autorizzazioni EXEC per il AspNet_SqlCachePollingStoredProcedure. Affinché il modello di polling funzioni correttamente, è necessario aggiungere l'account di processo al ruolo aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess. Lo strumento aspnet_regsql.exe non lo farà per te.

Configurazione delle dipendenze della cache SQL di Polling-Based

Per configurare le dipendenze della cache SQL basata sul polling sono necessari diversi passaggi. Il primo passaggio consiste nell'abilitare il database e la tabella, come illustrato in precedenza. Al termine del passaggio, il resto della configurazione è il seguente:

  • Configurazione del file di configurazione ASP.NET.
  • Configurazione di SqlCacheDependency

Configurazione del file di configurazione ASP.NET

Oltre ad aggiungere una stringa di connessione come illustrato in un modulo precedente, è necessario configurare anche un <elemento cache> con un <elemento sqlCacheDependency> , come illustrato di seguito:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="Pubs"
    connectionString="Data Source=(local);
      Initial Catalog=pubs;Integrated Security=true;"
    providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <caching>
      <sqlCacheDependency enabled = "true" pollTime = "60000" >
        <databases>
          <add name="pubs" connectionStringName = "pubs" pollTime = "9000000" />
        </databases>
      </sqlCacheDependency>
    </caching>
  </system.web>
</configuration>

Questa configurazione abilita una dipendenza della cache SQL nel database pubs . Si noti che l'attributo pollTime nell'elemento <sqlCacheDependency> per impostazione predefinita è 60000 millisecondi o 1 minuto. Questo valore non può essere inferiore a 500 millisecondi. In questo esempio l'elemento <add> aggiunge un nuovo database ed esegue l'override di pollTime, impostandolo su 9000000 millisecondi.

Configurazione di SqlCacheDependency

Il passaggio successivo consiste nel configurare SqlCacheDependency. Il modo più semplice per eseguire questa operazione consiste nel specificare il valore per l'attributo SqlDependency nella direttiva @ Outcache come indicato di seguito:

<%@ OutputCache duration="60"
    VaryByParam="none" SqlDependency="pubs:authors" %>

Nella direttiva @ OutputCache precedente è configurata una dipendenza della cache SQL per la tabella authors nel database pubs . È possibile configurare più dipendenze separandole con un punto e virgola come segue:

<%@ OutputCache duration="60"
    VaryByParam="none"
    SqlDependency="database_name:table_name;database_name:table_name" %>

Un altro metodo di configurazione di SqlCacheDependency consiste nell'eseguire questa operazione a livello di codice. Il codice seguente crea una nuova dipendenza della cache SQL dalla tabella authors nel database pubs .

SqlCacheDependency dep = new SqlCacheDependency("pubs", "authors");

Uno dei vantaggi della definizione della dipendenza della cache SQL a livello di codice è la gestione di eventuali eccezioni che possono verificarsi. Ad esempio, se si tenta di definire una dipendenza della cache SQL per un database che non è stato abilitato per la notifica, verrà generata un'eccezione DatabaseNotEnabledForNotificationException . In tal caso, è possibile tentare di abilitare il database per le notifiche chiamando il metodo SqlCacheDependencyAdmin.EnableNotifications e passandolo il nome del database.

Analogamente, se si tenta di definire una dipendenza della cache SQL per una tabella che non è stata abilitata per la notifica, verrà generata un'eccezione TableNotEnabledForNotificationException . È quindi possibile chiamare il metodo SqlCacheDependencyAdmin.EnableTableForNotifications passando il nome del database e il nome della tabella.

L'esempio di codice seguente illustra come configurare correttamente la gestione delle eccezioni durante la configurazione di una dipendenza della cache SQL.

try {
    SqlCacheDependency SqlDep = new
    SqlCacheDependency("pubs", "authors");
} catch (DatabaseNotEnabledForNotificationException exDBDis) {
    try {
        SqlCacheDependencyAdmin.EnableNotifications("pubs");
    } catch (UnauthorizedAccessException exPerm) {
        Response.Redirect("ErrorPage.htm");
    }
} catch (TableNotEnabledForNotificationException exTabDis) {
    try {
        SqlCacheDependencyAdmin.EnableTableForNotifications("pubs",
        "authors");
    } catch (System.Data.SqlClient.SqlException exc) {
        Response.Redirect("ErrorPage.htm");
    }
} finally {
    Cache.Insert("SqlSource", Source1, SqlDep);
}

Altre informazioni: https://msdn.microsoft.com/library/t9x04ed2.aspx

Query-Based dipendenze della cache SQL (solo SQL Server 2005)

Quando si usa SQL Server 2005 per la dipendenza della cache SQL, il modello basato sul polling non è necessario. Se usata con SQL Server 2005, le dipendenze della cache SQL comunicano direttamente tramite connessioni SQL all'istanza di SQL Server (non è necessaria alcuna configurazione aggiuntiva) usando le notifiche di query SQL Server 2005.

Il modo più semplice per abilitare la notifica basata su query consiste nel farlo in modo dichiarativo impostando l'attributo SqlCacheDependency dell'oggetto origine dati su CommandNotification e impostando l'attributo EnableCaching su true. Se si usa questo metodo, non è necessario alcun codice. Se il risultato di un comando eseguito sull'origine dati viene modificato, invaliderà i dati della cache.

Nell'esempio seguente viene configurato un controllo origine dati per la dipendenza della cache SQL:

<asp:SqlDataSource ID="ProductList" runat="server"
    ConnectionString="<%$ ConnectionStrings:Northwind %>"
    EnableCaching="true"
    SqlCacheDependency="CommandNotification"
    SelectCommand="SELECT * FROM [Products]" />

In questo caso, se la query specificata in SelectCommand restituisce un risultato diverso rispetto a quello originariamente, i risultati memorizzati nella cache vengono invalidati.

È anche possibile specificare che tutte le origini dati siano abilitate per le dipendenze della cache SQL impostando l'attributo SqlDependency della direttiva @ OutputCache su CommandNotification. L'esempio seguente illustra questa operazione.

<%@ OutputCache SqlDependency="CommandNotification" 
    duration="60" VaryByParam="none" %>

Nota

Per altre informazioni sulle notifiche delle query in SQL Server 2005, vedere la documentazione online di SQL Server.

Un altro metodo di configurazione di una dipendenza della cache SQL basata su query consiste nell'eseguire questa operazione a livello di codice usando la classe SqlCacheDependency. Nell'esempio di codice seguente viene illustrato come viene eseguita questa operazione.

string sql = "SELECT ProductName, ProductID FROM Products";
SqlConnection conn = new
SqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);
SqlCommand cmd = new SqlCommand(sql, conn);
SqlCacheDependency dep = new SqlCacheDependency(cmd);
Response.AddCacheDependency(dep);

Altre informazioni: https://msdn.microsoft.com/library/default.asp?url=/library/enus/dnvs05/html/querynotification.asp

Sostituzione post-cache

La memorizzazione nella cache di una pagina può aumentare notevolmente le prestazioni di un'applicazione Web. Tuttavia, in alcuni casi è necessario memorizzare nella cache la maggior parte della pagina e alcuni frammenti all'interno della pagina per essere dinamici. Ad esempio, se si crea una pagina di notizie interamente statica per i periodi di tempo impostati, è possibile impostare l'intera pagina da memorizzare nella cache. Se vuoi includere un banner pubblicitario rotante che è stato modificato in ogni richiesta di pagina, la parte della pagina contenente l'annuncio deve essere dinamica. Per consentire di memorizzare nella cache una pagina ma sostituire in modo dinamico un contenuto, è possibile usare ASP.NET sostituzione post-cache. Con la sostituzione post-cache, l'intera pagina viene memorizzata nella cache con parti specifiche contrassegnate come escluse dalla memorizzazione nella cache. Nell'esempio dei banner pubblicitari, il controllo AdRotator consente di sfruttare la sostituzione post-cache in modo che gli annunci vengano creati dinamicamente per ogni utente e per ogni aggiornamento della pagina.

Esistono tre modi per implementare la sostituzione post-cache:

  • In modo dichiarativo, utilizzando il controllo Sostituzione.
  • A livello di codice, usando l'API Controllo sostituzione.
  • In modo implicito, usando il controllo AdRotator.

Controllo sostituzione

Il controllo sostituzione ASP.NET specifica una sezione di una pagina memorizzata nella cache creata in modo dinamico anziché memorizzata nella cache. Si inserisce un controllo Sostituzione nella posizione nella pagina in cui si desidera visualizzare il contenuto dinamico. In fase di esecuzione, il controllo Sostituzione chiama un metodo specificato con la proprietà MethodName. Il metodo deve restituire una stringa, che sostituisce quindi il contenuto del controllo Sostituzione. Il metodo deve essere un metodo statico nel controllo Page o UserControl contenitore. L'uso del controllo di sostituzione comporta la modifica della cache lato client in modo che la cache del server non venga memorizzata nella cache del client. In questo modo si garantisce che le richieste future alla pagina chiamino di nuovo il metodo per generare contenuto dinamico.

API di sostituzione

Per creare contenuto dinamico per una pagina memorizzata nella cache a livello di codice, è possibile chiamare il metodo WriteSubstitution nel codice della pagina, passando il nome di un metodo come parametro. Il metodo che gestisce la creazione del contenuto dinamico accetta un singolo parametro HttpContext e restituisce una stringa. La stringa restituita è il contenuto che verrà sostituito nella posizione specificata. Un vantaggio della chiamata al metodo WriteSubstitution invece di utilizzare il controllo Substitution in modo dichiarativo consiste nel fatto che è possibile chiamare un metodo di qualsiasi oggetto arbitrario anziché chiamare un metodo statico dell'oggetto Page o UserControl.

La chiamata al metodo WriteSubstitution causa la modifica della cache lato client in modo che la cache del server non venga memorizzata nella cache del client. In questo modo si garantisce che le richieste future alla pagina chiamino di nuovo il metodo per generare contenuto dinamico.

Controllo AdRotator

Il controllo server AdRotator implementa il supporto per la sostituzione post-cache internamente. Se inserisci un controllo AdRotator nella pagina, eseguirà il rendering di annunci univoci in ogni richiesta, indipendentemente dal fatto che la pagina padre sia memorizzata nella cache. Di conseguenza, una pagina che include un controllo AdRotator viene memorizzata nella cache solo sul lato server.

Classe ControlCachePolicy

La classe ControlCachePolicy consente il controllo programmatico della memorizzazione nella cache dei frammenti usando i controlli utente. ASP.NET incorpora i controlli utente all'interno di un'istanza BasePartialCachingControl . La classe BasePartialCachingControl rappresenta un controllo utente con memorizzazione nella cache di output abilitata.

Quando si accede alla proprietà BasePartialCachingControl.CachePolicy di un controllo PartialCachingControl , si riceverà sempre un oggetto ControlCachePolicy valido. Tuttavia, se si accede alla proprietà UserControl.CachePolicy di un controllo UserControl , si riceve un oggetto ControlCachePolicy valido solo se il controllo utente è già sottoposto a wrapping da un controllo BasePartialCachingControl. Se non viene eseguito il wrapping, l'oggetto ControlCachePolicy restituito dalla proprietà genererà eccezioni quando si tenta di modificarlo perché non dispone di un oggetto BasePartialCachingControl associato. Per determinare se un'istanza di UserControl supporta la memorizzazione nella cache senza generare eccezioni, esaminare la proprietà SupportsCaching .

L'uso della classe ControlCachePolicy è uno dei diversi modi in cui è possibile abilitare la memorizzazione nella cache dell'output. L'elenco seguente descrive i metodi che è possibile usare per abilitare la memorizzazione nella cache dell'output:

  • Usare la direttiva @ OutputCache per abilitare la memorizzazione nella cache dell'output in scenari dichiarativi.
  • Usare l'attributo PartialCachingAttribute per abilitare la memorizzazione nella cache per un controllo utente in un file code-behind.
  • Utilizzare la classe ControlCachePolicy per specificare le impostazioni della cache in scenari programmatici in cui si usano le istanze BasePartialCachingControl abilitate per la cache usando uno dei metodi precedenti e caricate dinamicamente usando il metodo System.Web.UI.TemplateControl.LoadControl .

Un'istanza controlCachePolicy può essere modificata correttamente solo tra le fasi Init e PreRender del ciclo di vita del controllo. Se si modifica un oggetto ControlCachePolicy dopo la fase PreRender, ASP.NET genera un'eccezione perché tutte le modifiche apportate dopo il rendering del controllo non possono influire effettivamente sulle impostazioni della cache (durante la fase di rendering viene memorizzato nella cache un controllo). Infine, un'istanza del controllo utente (e quindi il relativo oggetto ControlCachePolicy) è disponibile solo per la manipolazione a livello di codice quando viene effettivamente eseguito il rendering.

Modifiche alla configurazione di memorizzazione nella cache - Elemento <di memorizzazione nella cache>

Esistono diverse modifiche alla configurazione di memorizzazione nella cache in ASP.NET 2.0. L'elemento <caching è nuovo in ASP.NET 2.0 e consente di apportare modifiche alla configurazione di memorizzazione nella cache> nel file di configurazione. Sono disponibili gli attributi seguenti.

elemento Descrizione
Cache Elemento facoltativo. Definisce le impostazioni globali della Cache delle applicazioni.
Outputcache Elemento facoltativo. Specifica le impostazioni della cache di output a livello di applicazione.
outputCacheSettings Elemento facoltativo. Specifica le impostazioni della cache di output che possono essere applicate alle pagine dell'applicazione.
sqlCacheDependency Elemento facoltativo. Configura le dipendenze della cache di SQL per un'applicazione ASP.NET.

Elemento <cache>

Nell'elemento <cache> sono disponibili gli attributi seguenti:

Attributo Descrizione
disableMemoryCollection Attributo Boolean facoltativo. Ottiene o imposta un valore che indica se la raccolta di memoria della cache che si verifica quando il computer è sotto pressione di memoria è disabilitato.
disableExpiration Attributo Boolean facoltativo. Ottiene o imposta un valore che indica se la scadenza della cache è disabilitata. Se disabilitato, gli elementi memorizzati nella cache non scadono e non si verifica lo scavenging in background degli elementi della cache scaduti.
privateBytesLimit Attributo Facoltativo Int64. Ottiene o imposta un valore che indica la dimensione massima dei byte privati di un'applicazione prima che la cache inizi a scaricare gli elementi scaduti e che tenta di recuperare memoria. Questo limite include sia la memoria usata dalla cache sia il normale sovraccarico di memoria dall'applicazione in esecuzione. Un'impostazione di zero indica che ASP.NET userà le proprie euristiche per determinare quando iniziare a recuperare memoria.
percentagePhysicalMemoryUsedLimit Attributo Facoltativo Int32 . Ottiene o imposta un valore che indica la percentuale massima di memoria fisica di un computer che può essere utilizzata da un'applicazione prima che la cache inizi a scaricare gli elementi scaduti e che tenta di recuperare memoria Questo utilizzo della memoria include sia la memoria usata dalla cache che l'utilizzo normale della memoria dell'applicazione in esecuzione. Un'impostazione di zero indica che ASP.NET userà le proprie euristiche per determinare quando iniziare a recuperare memoria.
privateBytesPollTime Attributo TimeSpan facoltativo. Ottiene o imposta un valore che indica l'intervallo di tempo tra il polling per l'utilizzo di byte privati dell'applicazione.

Elemento <outputCache>

Gli attributi seguenti sono disponibili per l'elemento <outputCache> .

Attributo Descrizione
enableOutputCache Attributo Boolean facoltativo. Abilita/disabilita la cache di output della pagina. Se disabilitato, nessuna pagina viene memorizzata nella cache indipendentemente dalle impostazioni a livello di codice o dichiarativo. Il valore predefinito è true.
enableFragmentCache Attributo Boolean facoltativo. Abilita/disabilita la cache dei frammenti dell'applicazione. Se disabilitato, nessuna pagina viene memorizzata nella cache indipendentemente dalla direttiva @ OutputCache o dal profilo di memorizzazione nella cache usata. Include un'intestazione di controllo cache che indica che i server proxy upstream e i client del browser non devono tentare di memorizzare nella cache l'output della pagina. Il valore predefinito è false.
sendCacheControlHeader Attributo Boolean facoltativo. Ottiene o imposta un valore che indica se l'intestazione cache-control:private viene inviata dal modulo cache di output per impostazione predefinita. Il valore predefinito è false.
ometteVaryStar Attributo Boolean facoltativo. Abilita/disabilita l'invio di un'intestazione Http "Vary: </strong>" nella risposta. Con l'impostazione predefinita di false, viene inviata un'intestazione "*Vary: *" per le pagine memorizzate nella cache di output. Quando viene inviata l'intestazione Vary, consente di memorizzare nella cache versioni diverse in base a quanto specificato nell'intestazione Vary. Ad esempio, Vary:User-Agents archivierà versioni diverse di una pagina in base all'agente utente che emette la richiesta. Il valore predefinito è **false.

Elemento <outputCacheSettings>

L'elemento <outputCacheSettings> consente la creazione di profili di cache come descritto in precedenza. L'unico elemento figlio per l'elemento outputCacheSettings è l'elemento <<outputCacheProfiles>> per la configurazione dei profili della cache.

Elemento <sqlCacheDependency>

Gli attributi seguenti sono disponibili per l'elemento <sqlCacheDependency> .

Attributo Descrizione
abilitata Attributo booleano obbligatorio. Indica se le modifiche vengono sottoposte a polling.
pollTime Attributo Facoltativo Int32 . Imposta la frequenza con cui SqlCacheDependency esegue il polling della tabella di database per le modifiche. Questo valore corrisponde al numero di millisecondi tra i polling successivi. Non può essere impostato su meno di 500 millisecondi. Il valore predefinito è 1 minuto.

Altre informazioni

Esistono alcune informazioni aggiuntive che è necessario tenere presente per quanto riguarda la configurazione della cache.

  • Se il limite di byte privati del processo di lavoro non è impostato, la cache userà uno dei limiti seguenti:

    • x86 2 GB: 800 MB o 60% di RAM fisica, minore
    • x86 3 GB: 1800 MB o 60% di RAM fisica, che tuttavia è minore
    • x64: 1 terabyte o 60% di RAM fisica, minore
  • Se vengono impostati sia il limite dei byte privati del processo di lavoro che <la cache privateBytesLimit/> , la cache userà il minimo dei due.

  • Proprio come in 1.x, si eliminano le voci della cache e si chiama GC. Raccogliere per due motivi:

    • Siamo molto vicini al limite di byte privati
    • La memoria disponibile è vicina o inferiore al 10%
  • È possibile disabilitare efficacemente il taglio e la cache per le condizioni di memoria a disponibilità ridotta impostando <percentuale di cachePhysicalMemoryUseLimit/> su 100.

  • A differenza di 1.x, 2.0 sospende il taglio e raccoglie le chiamate se l'ultima GC. La raccolta non riduce i byte privati o le dimensioni degli heaps gestiti di oltre il 1% del limite di memoria (cache).

Lab1: Dipendenze della cache personalizzate

  1. Creare un nuovo sito Web.

  2. Aggiungere un nuovo file XML denominato cache.xml e salvarlo nella radice dell'applicazione Web.

  3. Aggiungere il codice seguente al metodo Page_Load nel code-behind di default.aspx:

    System.Web.Caching.CacheDependency dep = new
        System.Web.Caching.CacheDependency(Server.MapPath("cache.xml"));
    Response.AddCacheDependency(dep);
    Cache.Insert("time", DateTime.Now.ToString());
    Response.Write(Cache["time"]);
    
  4. Aggiungere quanto segue alla parte superiore di default.aspx nella visualizzazione origine:

    <%@ OutputCache Duration="240" VaryByParam="None" %>
    
  5. Sfoglia Default.aspx. Che cosa dice il tempo?

  6. Aggiornare il browser. Che cosa dice il tempo?

  7. Aprire cache.xml e aggiungere il codice seguente:

    <anElement></anElement>
    
  8. Salvare cache.xml.

  9. Aggiornare il browser. Che cosa dice il tempo?

  10. Spiegare perché l'ora aggiornata anziché visualizzare i valori memorizzati nella cache in precedenza:

Lab 2: Uso delle dipendenze cache di Polling-Based

Questo lab usa il progetto creato nel modulo precedente che consente la modifica dei dati nel database Northwind tramite un controllo GridView e DetailsView.

  1. Aprire il progetto in Visual Studio 2005.

  2. Eseguire l'utilità aspnet_regsql sul database Northwind per abilitare il database e la tabella Products. Usare il comando seguente da un prompt dei comandi di Visual Studio:

    aspnet_regsql -S server -ed -d Northwind -E -et -t Products
    
  3. Aggiungere quanto segue al file web.config:

    <caching>
        <sqlCacheDependency enabled = "true" pollTime = "60000" >
            <databases>
                <add name="Northwind" connectionStringName = "Northwind" pollTime = "9000000" />
            </databases>
        </sqlCacheDependency>
    </caching>
    
  4. Aggiungere una nuova webform denominata showdata.aspx.

  5. Aggiungere la direttiva @ outputcache seguente alla pagina showdata.aspx:

    <%@ OutputCache SqlDependency="Northwind:Products" Duration="480" VaryByParam="None"%>
    
  6. Aggiungere il codice seguente alla Page_Load di showdata.aspx:

    Response.Write(DateTime.Now.ToString() + "<br><br>");
    
  7. Aggiungere un nuovo controllo SqlDataSource per showdata.aspx e configurarlo per usare la connessione al database Northwind. Scegliere Avanti.

  8. Selezionare le caselle di controllo ProductName e ProductID e fare clic su Avanti.

  9. Fare clic su Fine.

  10. Aggiungere una nuova proprietà GridView alla pagina showdata.aspx.

  11. Scegliere SqlDataSource1 dall'elenco a discesa.

  12. Salvare e esplorare showdata.aspx. Prendere nota dell'ora visualizzata.