Condividi tramite


Procedura dettagliata: memorizzazione nella cache dei dati applicazioni in ASP.NET

La memorizzazione nella cache consente di archiviare i dati in memoria per l'accesso rapido. Le applicazioni possono accedere alla cache e non devono recuperare i dati dall'origine ogni volta che vi accedono. In questo modo si evita la ripetizione delle query di dati ed è possibile migliorare prestazioni e scalabilità. Inoltre, la memorizzazione nella cache rende disponibili i dati quando l'origine dati non è temporaneamente disponibile.

.NET Framework fornisce classi che consentono di utilizzare funzionalità di memorizzazione nella cache nelle applicazioni ASP.NET. Queste classi sono definite nello spazio dei nomi System.Runtime.Caching.

Nota

Lo spazio dei nomi System.Runtime.Caching è nuovo in .NET Framework 4.Questo spazio dei nomi rende disponibile la memorizzazione nella cache a tutte le applicazioni .NET Framework.

In questa procedura dettagliata viene mostrato come utilizzare la funzionalità della memorizzazione nella cache, disponibile in .NET Framework, come parte di un'applicazione ASP.NET. Nella procedura dettagliata, viene memorizzato nella cache il contenuto di un file di testo.

Di seguito sono elencate alcune delle attività illustrate nella procedura dettagliata:

  • Creazione di un sito Web ASP.NET.

  • Aggiunta di un riferimento a .NET Framework 4.

  • Aggiunta di una voce della cache che memorizza nella cache il contenuto di un file.

  • Fornitura di criteri dell'eliminazione per la voce della cache.

  • Monitoraggio del percorso del file memorizzato nella cache e notifica alla cache delle modifiche degli elementi monitorati.

Prerequisiti

Per completare questa procedura dettagliata, è necessario disporre di quanto segue:

  • Microsoft Visual Studio 2010.

  • Un file di testo contenente una piccola quantità di testo. Si visualizzerà il contenuto di questo file di testo in una pagina Web.

Generazione di un sito Web ASP.NET

Si inizierà creando un sito Web ASP.NET.

Avviso

In questa procedura dettagliata viene utilizzato un progetto di sito Web.In alternativa, è possibile utilizzare un progetto di applicazione Web.Per informazioni sulla differenza tra questi tipi di progetto Web, vedere Confronto tra progetti di applicazione Web e progetti di sito Web.

Per creare un sito Web ASP.NET

  1. Avviare Visual Studio 2010.

  2. Scegliere Nuovo sito Web dal menu File. Se questa opzione non è disponibile, scegliere Nuovo, quindi fare clic su Sito Web.

    Verrà visualizzata la finestra di dialogo Nuovo sito Web.

  3. In Modelli installati fare clic su Visual Basic o C#, quindi selezionare Sito Web ASP.NET.

  4. Nella casella Percorso Web selezionare File system e immettere il nome della cartella in cui salvare le pagine del sito Web. Immettere ad esempio il nome della cartella C:\Websites\AppCaching, quindi fare clic su OK.

    In Visual Studio verrà creato un progetto Web che include funzionalità predefinite per il layout (una pagina master, le pagine contenuto Default.aspx e About.aspx e un foglio di stile CSS), per AJAX (file di script client) e per l'autenticazione (appartenenza ASP.NET). Quando viene creata una nuova pagina, per impostazione predefinita quest'ultima viene visualizzata in Visual Web Developer nella visualizzazione Origine, dove è possibile esaminarne gli elementi HMTL.

Il passaggio successivo consiste nell'aggiunta del file di testo che si desidera utilizzare nel progetto di sito Web corrente.

Per aggiungere il file di testo al progetto

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nome del progetto e scegliere Aggiungi elemento esistente.

  2. Nella finestra di dialogo Aggiungi elemento esistente selezionare il file di testo che si desidera utilizzare per la procedura dettagliata, quindi scegliere Aggiungi.

Aggiunta di un riferimento all'assembly di memorizzazione nella cache

Per utilizzare lo spazio dei nomi System.Runtime.Caching in un'applicazione ASP.NET, è necessario aggiungere un riferimento allo spazio dei nomi.

Per aggiungere un riferimento al sito Web

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nome del sito Web e scegliere Aggiungi riferimento.

  2. Selezionare la scheda .NET, System.Runtime.Caching, quindi scegliere OK.

Aggiunta di controlli alla pagina ASP.NET

Il passaggio successivo consiste nell'aggiunta di un pulsante e di un controllo Label alla pagina. Si creerà un gestore dell'evento per l'evento Click del pulsante. Successivamente si aggiungerà del codice mediante il quale, quando si fa clic sul pulsante, nel controllo Label venga visualizzato il testo memorizzato nella cache.

Per aggiungere controlli alla pagina

  1. Aprire oppure passare alla pagina Default.aspx.

  2. Dalla scheda Standard della Casella degli strumenti trascinare un controllo Button nella pagina Default.aspx.

  3. Nella finestra Proprietà impostare la proprietà Text del controllo Button su Ottieni da cache. Accettare la proprietà ID predefinita.

  4. Dalla scheda Standard della Casella degli strumenti trascinare un controllo Label nella pagina. Accettare la proprietà ID predefinita.

Creazione della cache e memorizzazione di una voce nella cache

Successivamente, si aggiungerà il codice per eseguire le attività seguenti:

  • Creare un'istanza della classe cache (ossia creare un'istanza dell'oggetto cache).

  • Specificare che la cache utilizza un oggetto HostFileChangeMonitor per monitorare le modifiche nel file di testo.

  • Leggere il file di testo e memorizzare nella cache il relativo contenuto come voce della cache.

  • Visualizzare il contenuto del file di testo memorizzato nella cache.

Per creare l'oggetto cache

  1. Fare doppio clic sul pulsante per creare un gestore dell'evento nel file Default.aspx.cs o Default.aspx.vb.

  2. All'inizio del file (prima della dichiarazione di classe), aggiungere le istruzioni Imports (Visual Basic) o using (C#) seguenti.

    [Visual Basic]

    Imports System.Runtime.Caching
    Imports System.IO
    

    [C#]

    using System.Runtime.Caching;
    using System.IO;
    
  3. Nel gestore eventi, aggiungere il codice riportato di seguito per creare un'istanza della cache.

    [Visual Basic]

    Dim cache As ObjectCache = MemoryCache.Default
    

    [C#]

    ObjectCache cache = MemoryCache.Default;
    

    ObjectCache è una classe di base che fornisce metodi per l'implementazione di un oggetto cache in memoria.

    Nota

    In ASP.NET 4, la memorizzazione nella cache è implementata mediante la classe ObjectCache.

  4. Aggiungere il codice seguente per leggere il contenuto di una voce della cache denominata filecontents

    [Visual Basic]

    Dim fileContents As String = TryCast(cache("filecontents"), String)
    

    [C#]

    string fileContents = cache["filecontents"] as string;
    
  5. Aggiungere il codice seguente per verificare se la voce della cache denominata filecontents esiste

    [Visual Basic]

    If fileContents Is Nothing Then
    
    End If
    

    [C#]

    if (fileContents == null)
    {
    
    }
    

    Se la voce della cache specificata non esiste, è necessario leggere il file di testo e aggiungerlo alla cache come voce della cache.

  6. Nel blocco if/then, aggiungere il codice seguente per creare un nuovo oggetto CacheItemPolicy che specifica che la cache scade dopo 10 secondi.

    [Visual Basic]

    Dim policy As New CacheItemPolicy()
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0)
    

    [C#]

    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10.0);
    

    Se non viene fornita alcuna informazione di eliminazione o scadenza, l'impostazione predefinita è InfiniteAbsoluteExpiration secondo cui gli elementi nella cache non scadono in base a un tempo assoluto. Viceversa, gli elementi scadono solo in condizioni di pressione della memoria. Come procedura consigliata, è sempre opportuno fornire esplicitamente una scadenza assoluta o variabile. In questa procedura dettagliata, si utilizza una scadenza assoluta di 10 secondi.

  7. All'interno del blocco if/then, seguendo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per creare un insieme per i percorsi file che si desidera monitorare e aggiungere il percorso del file di testo all'insieme.

    [Visual Basic]

    Dim filePaths As New List(Of String)()
    Dim cachedFilePath As String = Server.MapPath("~") & _
            "\cacheText.txt"
    filePaths.Add(cachedFilePath)
    

    [C#]

    List<string> filePaths = new List<string>();
    string cachedFilePath = Server.MapPath("~") + "\\cacheText.txt";
    filePaths.Add(cachedFilePath);
    

    Il metodo HttpServerUtilityMapPath() restituisce il percorso alla radice del sito Web corrente.

  8. Seguendo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per aggiungere un nuovo oggetto HostFileChangeMonitor all'insieme di monitoraggio delle modifiche per la voce della cache.

    [Visual Basic]

    policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
    

    [C#]

    policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
    

L'oggetto HostFileChangeMonitor esamina il percorso del file di testo e notifica alla cache se si verificano modifiche. In questo esempio, la voce della cache scadrà automaticamente se il contenuto del file viene modificato.

  1. Seguendo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per leggere il contenuto del file di testo.

    fileContents = File.ReadAllText(cachedFilePath) & vbCrLf & DateTime.Now.ToString()
    
    fileContents = File.ReadAllText(cachedFilePath) + "\n" + DateTime.Now; 
    

    Viene aggiunto il timestamp di data e ora per consentire di determinare la scadenza della voce della cache.

  2. Seguendo il codice aggiunto nel passaggio precedente, aggiungere il codice seguente per inserire il contenuto del file nell'oggetto cache come un'istanza di CacheItem.

    [Visual Basic]

    cache.Set("filecontents", fileContents, policy)
    

    [C#]

    cache.Set("filecontents", fileContents, policy);
    

    Specificare informazioni sulla voce della cache da eliminare passando l'oggetto CacheItemPolicy come metodo Set del parametro.

  3. Dopo il blocco if/then, aggiungere il codice seguente per visualizzare il contenuto del file memorizzato nella cache in un controllo Label.

    [Visual Basic]

    Label1.Text = fileContents
    

    [C#]

    Label1.Text = fileContents;
    

Test di memorizzazione nella cache nel sito Web ASP.NET

È ora possibile eseguire il test dell'applicazione.

Per testare la memorizzazione nella cache nel sito Web ASP.NET

  1. Premere CTRL+F5 per eseguire l'applicazione.

  2. Fare clic su Ottieni da cache.

    Il contenuto memorizzato nella cache nel file di testo viene visualizzato nell'etichetta. Notare il timestamp alla fine del file.

  3. Fare nuovamente clic su Ottieni da cache.

    Il timestamp è invariato. Questo indica che viene visualizzato il contenuto memorizzato nella cache.

  4. Attendere 10 secondi o più, quindi far nuovamente clic su Ottieni da cache.

    Questa volta viene visualizzato un nuovo timestamp. Questo indica che i criteri consentono alla cache di scadere dopo 10 secondi e che viene visualizzato il nuovo contenuto della cache.

  5. In un editor di testo, aprire il file di testo aggiunto al progetto di sito Web. Non apportare ancora alcuna modifica.

  6. Fare nuovamente clic su Ottieni da cache.

    Notare nuovamente il timestamp.

  7. Apportare una modifica al file di testo e salvarlo.

  8. Fare nuovamente clic su Ottieni da cache.

    Questa volta il timestamp viene immediatamente modificato. Questo indica che il monitoraggio delle modifiche del file host ha immediatamente eliminato l'elemento della cache quando si è apportata la modifica.

    Nota

    È possibile aumentare il tempo di eliminazione a 20 secondi o più, per disporre di più tempo per apportare la modifica nel file.

Esempio di codice

Dopo avere completato questa procedura dettagliata, l'aspetto del codice per il sito Web sarà simile all'esempio seguente.

Imports System.Runtime.Caching
Imports System.IO

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Button1_Click(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        Dim cache As ObjectCache = MemoryCache.Default
        Dim fileContents As String = TryCast(cache("filecontents"), _
            String)
        If fileContents Is Nothing Then
            Dim policy As New CacheItemPolicy()
            policy.AbsoluteExpiration = _
                DateTimeOffset.Now.AddSeconds(10.0)
            Dim filePaths As New List(Of String)()
            Dim cachedFilePath As String = Server.MapPath("~") & _
                "\cacheText.txt"
            filePaths.Add(cachedFilePath)
            policy.ChangeMonitors.Add(New  _
                HostFileChangeMonitor(filePaths))

            ' Fetch the file contents.
            fileContents = File.ReadAllText(cachedFilePath) & _
                vbCrLf & DateTime.Now.ToString()
            cache.Set("filecontents", fileContents, policy)
        End If
        Label1.Text = fileContents
    End Sub

End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.Caching;
using System.IO;

public partial class _Default : System.Web.UI.Page
{


    protected void Button1_Click1(object sender, EventArgs e)
    {
        ObjectCache cache = MemoryCache.Default;
        string fileContents = cache["filecontents"] as string;

        if (fileContents == null)
        {
            CacheItemPolicy policy = new CacheItemPolicy();
            policy.AbsoluteExpiration =
                DateTimeOffset.Now.AddSeconds(10.0);

            List<string> filePaths = new List<string>();
            string cachedFilePath = Server.MapPath("~") +
                "\\cacheText.txt";

            filePaths.Add(cachedFilePath);

            policy.ChangeMonitors.Add(new
                HostFileChangeMonitor(filePaths));

            // Fetch the file contents.
            fileContents = File.ReadAllText(cachedFilePath) + "\n"
                + DateTime.Now.ToString();

            cache.Set("filecontents", fileContents, policy);

        }

        Label1.Text = fileContents;
    }
}

Passaggi successivi

In ASP.NET, è possibile utilizzare più implementazioni della cache per memorizzare dati nella cache. Per ulteriori informazioni, vedere l'articolo relativo alla memorizzazione nella cache dei dati dell'applicazione mediante più oggetti cache in un'applicazione ASP.NET.

Vedere anche

Riferimenti

MemoryCache

ObjectCache

Concetti

Memorizzazione nella cache in applicazioni .NET Framework