共用方式為


逐步解說:在 ASP.NET 中快取應用程式資料

快取可讓您將資料儲存在記憶體中,以進行快速存取。 應用程式可以存取快取,不需要每次存取資料時都從原始來源擷取資料。 這會避免重複查詢資料,也可以改善效能和延展性。 此外,當資料來源暫時無法使用時,快取也可讓資料可供使用。

.NET Framework 提供的類別可讓您在 ASP.NET 應用程式中使用快取功能。 這些類別是在 System.Runtime.Caching 命名空間中定義。

注意事項注意事項

System.Runtime.Caching 命名空間是 .NET Framework 4 所新增的。這個命名空間會讓快取可供所有 .NET Framework 應用程式使用。

這個逐步解說會示範如何使用 .NET Framework 中當做 ASP.NET 應用程式之一部分提供的快取功能。 在此逐步解說中,您會快取文字檔案的內容。

本逐步解說所述的工作包括下列各項:

  • 建立 ASP.NET 網站。

  • 加入 .NET Framework 4 的參考。

  • 加入快取檔案內容的快取項目。

  • 為快取項目提供收回原則。

  • 監控快取檔案的路徑,並向快取通知受監控之項目的變更。

必要條件

若要完成這個逐步解說,您必須要有:

  • Microsoft Visual Studio 2010。

  • 包含少量文字的文字檔。 您將會在網頁中顯示此文字檔案的內容。

建立 ASP.NET 網站

您一開始會建立 ASP.NET 網站。

警告

這個逐步解說會使用網站專案。您可以改用 Web 應用程式專案。如需這些 Web 專案類型之差異的詳細資訊,請參閱 Web 應用程式專案和網站專案的比較

若要建立 ASP.NET 網站

  1. 啟動 Visual Studio 2010。

  2. 按一下 [檔案] 功能表上的 [新網站]。 (如果未出現這個選項,請按一下 [新增],然後按一下 [網站])。

    [新網站] 對話方塊便會顯示。

  3. 在 [已安裝的範本] 底下,按一下 [Visual Basic] 或 [C#],然後選取 [ASP.NET 網站]。

  4. 選取 [網站位置] 方塊中的 [檔案系統],然後輸入用於存放網站網頁之資料夾的名稱。 例如,輸入資料夾名稱 C:\Websites\AppCaching 然後按一下 [確定]。

    Visual Studio 會建立含有預建之配置 (主版頁面、Default.aspx 和 About.aspx 內容頁面以及階層式樣式表)、Ajax (用戶端指令碼檔) 和驗證 (ASP.NET 成員資格) 功能的 Web 專案。 建立新網頁後,根據預設,Visual Web Developer 會在 [原始碼] 檢視內顯示網頁,您可以在其中檢視網頁的 HTML 項目。

下一步是將您想要使用的文字檔加入目前的網站專案。

若要將文字檔加入專案中

  1. 在 [方案總管] 中,以滑鼠右鍵按一下專案名稱,然後按一下 [加入現有項目]。

  2. 在 [加入現有項目] 對話方塊中,選取您想要用於這個逐步解說的文字檔,然後按一下 [加入]。

加入快取組件的參考

若要在 ASP.NET 應用程式中使用 System.Runtime.Caching 命名空間,您必須加入此命名空間的參考。

若要加入網站的參考

  1. 在 [方案總管] 中,以滑鼠右鍵按一下網站名稱,然後按一下 [加入參考]。

  2. 選取 [.NET] 索引標籤,並選取 [System.Runtime.Caching],然後按一下 [確定]。

將控制項加入 ASP.NET 網頁

下一步是將按鈕和 Label 控制項加入至網頁。 您將會為按鈕的 Click 事件建立事件處理常式。 稍後當您按一下此按鈕時將會加入程式碼,快取文字便會顯示在 Label 控制項內。

若要將控制項加入頁面中

  1. 開啟或切換至 Default.aspx 網頁。

  2. 從 [工具箱] 的 [標準] 索引標籤中,將 Button 控制項拖曳至 Default.aspx 網頁。

  3. 在 [屬性] 視窗中,設定 Button 控制項的 Text 屬性來從快取中取得。 接受預設 ID 屬性。

  4. 在 [工具箱] 的 [標準] 索引標籤中,將 Label 控制項拖曳至頁面上。 接受預設 ID 屬性。

建立快取及快取項目

接下來,您會加入程式碼來執行下列工作:

  • 建立快取類別的執行個體,也就是說,您將會執行個體化快取物件。

  • 指定快取使用 HostFileChangeMonitor 物件來監控文字檔的變更。

  • 讀取文字檔,並快取其內容當做快取項目。

  • 顯示快取文字檔的內容。

若要建立快取物件

  1. 按兩下此按鈕,即可在 Default.aspx.cs 或 Default.aspx.vb 檔案中建立事件處理常式。

  2. 在檔案最上方 (類別宣告之前) 加入下列 Imports (Visual Basic) 或 using (C#) 陳述式。

    [Visual Basic]

    Imports System.Runtime.Caching
    Imports System.IO
    

    [C#]

    using System.Runtime.Caching;
    using System.IO;
    
  3. 在事件處理常式中,加入下列程式碼來執行個體化快取。

    [Visual Basic]

    Dim cache As ObjectCache = MemoryCache.Default
    

    [C#]

    ObjectCache cache = MemoryCache.Default;
    

    ObjectCache 是基底類別,可提供方法來實作記憶體中的快取物件。

    注意事項注意事項

    在 ASP.NET 4 中,快取是使用 ObjectCache 類別所實作。

  4. 加入下列程式碼,以讀取名為 filecontents 的快取項目內容

    [Visual Basic]

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

    [C#]

    string fileContents = cache["filecontents"] as string;
    
  5. 加入下列程式碼,以檢查名為 filecontents 的快取項目是否存在

    [Visual Basic]

    If fileContents Is Nothing Then
    
    End If
    

    [C#]

    if (fileContents == null)
    {
    
    }
    

    如果指定的快取項目不存在,您必須讀取此文字檔,並將它當做快取項目加入至快取。

  6. 在 if/then 區塊中加入下列程式碼來建立新的 CacheItemPolicy 物件,該物件指定快取在 10 秒鐘之後到期。

    [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);
    

    如果未提供任何收回或到期資訊,預設值會是 InfiniteAbsoluteExpiration,這表示快取中項目的到期時間不是根據絕對時間。 只有當有記憶體壓力時,項目才會到期。 最佳作法是永遠都要明確提供絕對或側線到期。 在此逐步解說中,您會使用 10 秒的絕對到期期限。

  7. 在 if/then 區塊內以及您於上一個步驟加入的程式碼後面加入下列程式碼,以建立您想要監控之檔案路徑的集合,並將文字檔的路徑加入至集合中。

    [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);
    

    HttpServerUtilityMapPath() 方法會傳回目前網站之根目錄的路徑。

  8. 在您於前一個步驟加入的程式碼後面加入下列程式碼,以便將新的 HostFileChangeMonitor 物件加入至快取項目的變更監視器集合中。

    [Visual Basic]

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

    [C#]

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

HostFileChangeMonitor 物件會監控文字檔的路徑,並通知快取是否發生變更。 在此範例中,如果檔案內容變更,快取項目將會自動到期。

  1. 在您於前一個步驟加入的程式碼後面,加入下列程式碼來讀取文字檔的內容。

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

    加入日期和時間的時間戳記可協助您判斷快取項目何時到期。

  2. 在您於前一個步驟加入的程式碼後面加入下列程式碼,以便將檔案內容當做 CacheItem 執行個體加入快取物件中。

    [Visual Basic]

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

    [C#]

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

    您會藉由將 CacheItemPolicy 物件指定為 Set 參數方法來指定應該如何收回快取項目的相關資訊。

  3. 在 if/then 區塊後面加入下列程式碼,以便在 Label 控制項內顯示快取檔案內容。

    [Visual Basic]

    Label1.Text = fileContents
    

    [C#]

    Label1.Text = fileContents;
    

測試 ASP.NET 網站中的快取

現在,可以開始測試應用程式。

若要測試 ASP.NET 網站中的快取

  1. 按 CTRL+F5 執行應用程式。

  2. 按一下 [從快取取得]。

    文字檔中的快取內容會顯示在標籤內。 請注意檔案結尾的時間戳記。

  3. 再次按一下 [從快取取得]。

    時間戳記維持不變。 這表示會顯示快取內容。

  4. 等候 10 秒鐘或更長的時間,然後再次按一下 [從快取取得]。

    這次會顯示新的時間戳記。 這表示此原則讓快取在 10 秒鐘之後到期並顯示新的快取內容。

  5. 在文字編輯器中,開啟您加入至網站專案的文字檔。 還不要做任何變更。

  6. 再次按一下 [從快取取得]。

    再次注意時間戳記。

  7. 對文字檔進行變更,然後儲存檔案。

  8. 再次按一下 [從快取取得]。

    這次時間戳記會立即變更。 這表示當您進行變更時,主機檔案變更監視器立即收回快取項目。

    注意事項注意事項

    您可以將收回時間提高為 20 秒或更長的時間,讓您有更多時間可以在檔案中進行變更。

程式碼範例

當您完成本逐步解說之後,您所建立之網站的程式碼將會與下列範例類似。

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;
    }
}

後續步驟

在 ASP.NET 中,您可以使用多個快取實作來快取資料。 如需詳細資訊,請參閱在 ASP.NET 應用程式中使用多個快取物件來快取應用程式資料 (英文)。

請參閱

參考

MemoryCache

ObjectCache

概念

.NET Framework 應用程式中的快取