逐步解說:在 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 網站
啟動 Visual Studio 2010。
按一下 [檔案] 功能表上的 [新網站]。 (如果未出現這個選項,請按一下 [新增],然後按一下 [網站])。
[新網站] 對話方塊便會顯示。
在 [已安裝的範本] 底下,按一下 [Visual Basic] 或 [C#],然後選取 [ASP.NET 網站]。
選取 [網站位置] 方塊中的 [檔案系統],然後輸入用於存放網站網頁之資料夾的名稱。 例如,輸入資料夾名稱 C:\Websites\AppCaching 然後按一下 [確定]。
Visual Studio 會建立含有預建之配置 (主版頁面、Default.aspx 和 About.aspx 內容頁面以及階層式樣式表)、Ajax (用戶端指令碼檔) 和驗證 (ASP.NET 成員資格) 功能的 Web 專案。 建立新網頁後,根據預設,Visual Web Developer 會在 [原始碼] 檢視內顯示網頁,您可以在其中檢視網頁的 HTML 項目。
下一步是將您想要使用的文字檔加入目前的網站專案。
若要將文字檔加入專案中
在 [方案總管] 中,以滑鼠右鍵按一下專案名稱,然後按一下 [加入現有項目]。
在 [加入現有項目] 對話方塊中,選取您想要用於這個逐步解說的文字檔,然後按一下 [加入]。
加入快取組件的參考
若要在 ASP.NET 應用程式中使用 System.Runtime.Caching 命名空間,您必須加入此命名空間的參考。
若要加入網站的參考
在 [方案總管] 中,以滑鼠右鍵按一下網站名稱,然後按一下 [加入參考]。
選取 [.NET] 索引標籤,並選取 [System.Runtime.Caching],然後按一下 [確定]。
將控制項加入 ASP.NET 網頁
下一步是將按鈕和 Label 控制項加入至網頁。 您將會為按鈕的 Click 事件建立事件處理常式。 稍後當您按一下此按鈕時將會加入程式碼,快取文字便會顯示在 Label 控制項內。
若要將控制項加入頁面中
開啟或切換至 Default.aspx 網頁。
從 [工具箱] 的 [標準] 索引標籤中,將 Button 控制項拖曳至 Default.aspx 網頁。
在 [屬性] 視窗中,設定 Button 控制項的 Text 屬性來從快取中取得。 接受預設 ID 屬性。
在 [工具箱] 的 [標準] 索引標籤中,將 Label 控制項拖曳至頁面上。 接受預設 ID 屬性。
建立快取及快取項目
接下來,您會加入程式碼來執行下列工作:
建立快取類別的執行個體,也就是說,您將會執行個體化快取物件。
指定快取使用 HostFileChangeMonitor 物件來監控文字檔的變更。
讀取文字檔,並快取其內容當做快取項目。
顯示快取文字檔的內容。
若要建立快取物件
按兩下此按鈕,即可在 Default.aspx.cs 或 Default.aspx.vb 檔案中建立事件處理常式。
在檔案最上方 (類別宣告之前) 加入下列 Imports (Visual Basic) 或 using (C#) 陳述式。
[Visual Basic]
Imports System.Runtime.Caching Imports System.IO
[C#]
using System.Runtime.Caching; using System.IO;
在事件處理常式中,加入下列程式碼來執行個體化快取。
[Visual Basic]
Dim cache As ObjectCache = MemoryCache.Default
[C#]
ObjectCache cache = MemoryCache.Default;
ObjectCache 是基底類別,可提供方法來實作記憶體中的快取物件。
注意事項 在 ASP.NET 4 中,快取是使用 ObjectCache 類別所實作。
加入下列程式碼,以讀取名為 filecontents 的快取項目內容
[Visual Basic]
Dim fileContents As String = TryCast(cache("filecontents"), String)
[C#]
string fileContents = cache["filecontents"] as string;
加入下列程式碼,以檢查名為 filecontents 的快取項目是否存在
[Visual Basic]
If fileContents Is Nothing Then End If
[C#]
if (fileContents == null) { }
如果指定的快取項目不存在,您必須讀取此文字檔,並將它當做快取項目加入至快取。
在 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 秒的絕對到期期限。
在 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() 方法會傳回目前網站之根目錄的路徑。
在您於前一個步驟加入的程式碼後面加入下列程式碼,以便將新的 HostFileChangeMonitor 物件加入至快取項目的變更監視器集合中。
[Visual Basic]
policy.ChangeMonitors.Add(New HostFileChangeMonitor(filePaths))
[C#]
policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
HostFileChangeMonitor 物件會監控文字檔的路徑,並通知快取是否發生變更。 在此範例中,如果檔案內容變更,快取項目將會自動到期。
在您於前一個步驟加入的程式碼後面,加入下列程式碼來讀取文字檔的內容。
fileContents = File.ReadAllText(cachedFilePath) & vbCrLf & DateTime.Now.ToString()
fileContents = File.ReadAllText(cachedFilePath) + "\n" + DateTime.Now;
加入日期和時間的時間戳記可協助您判斷快取項目何時到期。
在您於前一個步驟加入的程式碼後面加入下列程式碼,以便將檔案內容當做 CacheItem 執行個體加入快取物件中。
[Visual Basic]
cache.Set("filecontents", fileContents, policy)
[C#]
cache.Set("filecontents", fileContents, policy);
您會藉由將 CacheItemPolicy 物件指定為 Set 參數方法來指定應該如何收回快取項目的相關資訊。
在 if/then 區塊後面加入下列程式碼,以便在 Label 控制項內顯示快取檔案內容。
[Visual Basic]
Label1.Text = fileContents
[C#]
Label1.Text = fileContents;
測試 ASP.NET 網站中的快取
現在,可以開始測試應用程式。
若要測試 ASP.NET 網站中的快取
按 CTRL+F5 執行應用程式。
按一下 [從快取取得]。
文字檔中的快取內容會顯示在標籤內。 請注意檔案結尾的時間戳記。
再次按一下 [從快取取得]。
時間戳記維持不變。 這表示會顯示快取內容。
等候 10 秒鐘或更長的時間,然後再次按一下 [從快取取得]。
這次會顯示新的時間戳記。 這表示此原則讓快取在 10 秒鐘之後到期並顯示新的快取內容。
在文字編輯器中,開啟您加入至網站專案的文字檔。 還不要做任何變更。
再次按一下 [從快取取得]。
再次注意時間戳記。
對文字檔進行變更,然後儲存檔案。
再次按一下 [從快取取得]。
這次時間戳記會立即變更。 這表示當您進行變更時,主機檔案變更監視器立即收回快取項目。
注意事項 您可以將收回時間提高為 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 應用程式中使用多個快取物件來快取應用程式資料 (英文)。