首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 快取技術實戰:以 XML 檔案為資料來源的 Cache 依賴範例

     編輯:關於ASP.NET

ASP.NET Cache 物件提供伺服器端記憶體快取機制,搭配 CacheDependency 可自動監視檔案變更並使快取失效。本文示範以 XML 檔案為資料來源,實作「讀取快取 → 快取遺漏時載入 XML → 建立檔案相依性」完整流程。

案例情境

  • 資料來源:~/App_Data/LoginMsg.xml 記錄用戶登入時間。
  • 顯示介面:GridView 綁定 DataView。
  • 需求:讀取優先用快取,XML 異動自動更新快取。

核心程式碼:LoadData() 方法

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

寫入資料並觸發快取更新:LoginMsg_Click

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 時防止資料損毀。

效能與擴充建議

  • 大量資料:XML 不適合高併發寫入,建議改用 SQL Server + SqlCacheDependency。
  • 分散式部署:單機 Cache 無法跨伺服器同步,請使用 Redis、NCache 或 ASP.NET Core IDistributedCache。
  • 快取過期策略:搭配 Cache.NoAbsoluteExpiration、Cache.NoSlidingExpiration 僅靠相依性驅動,或設定滑動過期 TimeSpan.FromMinutes(30) 作為保底。
  • 資料保護:密碼欄位務必雜湊(BCrypt/PBKDF2),切勿明碼儲存。

現代化替代方案(ASP.NET Core)

// 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 壓力,提升回應速度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved