ASP.NET Cache 物件提供伺服器端記憶體快取機制,搭配 CacheDependency 可自動監視檔案變更並使快取失效。本文示範以 XML 檔案為資料來源,實作「讀取快取 → 快取遺漏時載入 XML → 建立檔案相依性」完整流程。
~/App_Data/LoginMsg.xml 記錄用戶登入時間。GridView 綁定 DataView。public void LoadData()
{
DataView dv = Cache["MyData"] as DataView;
if (dv == null)
{
// 快取遺漏:讀取 XML 建立 DataSet
DataSet ds = new DataSet();
string xmlPath = Server.MapPath("~/App_Data/LoginMsg.xml");
using (FileStream fs = new FileStream(xmlPath, FileMode.Open, FileAccess.Read))
using (StreamReader sr = new StreamReader(fs))
{
ds.ReadXml(sr);
}
dv = new DataView(ds.Tables[0]);
// 建立快取相依性:監視 XML 檔案變更
Cache.Insert("MyData", dv, new CacheDependency(xmlPath));
lblStatus.Text = "從 XML 檔案載入資料(快取已建立)";
}
else
{
lblStatus.Text = "從快取讀取資料";
}
gvData.DataSource = dv;
gvData.DataBind();
}
protected void LoginMsg_Click(object sender, EventArgs e)
{
if (!Page.IsValid) { lblStatus.Text = "請輸入登入資訊"; return; }
string xmlPath = Server.MapPath("~/App_Data/LoginMsg.xml");
DataSet ds = new DataSet();
// 讀取現有 XML(允許共享讀取)
using (FileStream fs = new FileStream(xmlPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (StreamReader sr = new StreamReader(fs))
{
ds.ReadXml(sr);
}
// 新增一筆記錄
DataRow row = ds.Tables[0].NewRow();
row["custom_email"] = txtEmail.Text;
row["custom_pass"] = txtPassword.Text; // 實務請勿明碼儲存密碼
row["login_time"] = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
ds.Tables[0].Rows.Add(row);
// 寫回 XML(同步寫入避免並發衝突)
using (FileStream fs = new FileStream(xmlPath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
using (StreamWriter sw = new StreamWriter(fs))
{
sw = TextWriter.Synchronized(sw);
ds.WriteXml(sw);
}
// 移除快取,下次 LoadData() 將重新讀取 XML
Cache.Remove("MyData");
LoadData();
}
| 技術 | 說明 |
|---|---|
| Cache.Insert(key, value, dependency) | 建立快取項目並關聯相依性。依賴項目變更時,快取自動移除。 |
| CacheDependency(filePath) | 監視單一檔案或目錄。支援多檔案陣列 new CacheDependency(new[] { file1, file2 })。 |
| Cache.Remove(key) | 主動移除快取。寫入資料後呼叫,確保下次讀取最新資料。 |
| FileShare.ReadWrite | 允許其他程序同時讀寫同一檔案,避免鎖定衝突。 |
| TextWriter.Synchronized | 提供執行緒安全的包裝器,多執行緒寫入 XML 時防止資料損毀。 |
SqlCacheDependency。IDistributedCache。Cache.NoAbsoluteExpiration、Cache.NoSlidingExpiration 僅靠相依性驅動,或設定滑動過期 TimeSpan.FromMinutes(30) 作為保底。// Startup.cs
services.AddDistributedMemoryCache(); // 或 AddStackExchangeRedisCache()
// Controller
public async Task<IActionResult> Index()
{
var data = await _cache.GetOrCreateAsync("MyData", async entry => {
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30);
return await LoadFromXmlAsync();
});
return View(data);
}
ASP.NET Cache 搭配 CacheDependency 是輕量級資料快取的經典模式,適合「讀多寫少、資料量中小、單機部署」場景。掌握其運作機制,能有效降低資料庫/I/O 壓力,提升回應速度。