ASP.NET MVC - 快取



本章將重點介紹一種最常見的 ASP.NET 技術:快取,以提高應用程式的效能。快取意味著將經常使用的東西儲存在記憶體中以提供更好的效能。我們將瞭解如何透過利用輸出快取來顯著提高 ASP.NET MVC 應用程式的效能。

在 ASP.NET MVC 中,有一個 OutputCache 過濾器屬性可以應用,這與 Web 窗體中的輸出快取概念相同。輸出快取使您可以快取控制器操作返回的內容。

輸出快取基本上允許您將特定控制器的輸出儲存在記憶體中。因此,將來對該控制器中相同操作的任何請求都將從快取結果返回。這樣,每次呼叫相同的控制器操作時,就不需要重新生成相同的內容。

為什麼要快取?

我們需要在許多不同的場景中使用快取來提高應用程式的效能。例如,您有一個 ASP.NET MVC 應用程式,它顯示員工列表。現在,每次使用者呼叫控制器操作時,這些記錄都是透過執行資料庫查詢從資料庫中檢索的,然後返回 Index 檢視。

因此,您可以利用輸出快取來避免每次使用者呼叫相同的控制器操作時都執行資料庫查詢。在這種情況下,檢視將從快取中檢索,而不是從控制器操作重新生成。

快取使您可以避免在伺服器上執行冗餘工作。

讓我們來看一個在專案中使用快取的簡單示例。

[OutputCache(Duration = 60)]
public ActionResult Index(){
   var employees = from e in db.Employees
   orderby e.ID
   select e;
   return View(employees);
}

如您所見,我們在 EmployeeController 的 index 操作中添加了“OutputCache”屬性。現在為了理解這個概念,讓我們在除錯模式下執行這個應用程式,並在 Index 操作方法中插入一個斷點。

OutputCache

指定以下 URL **https://:63004/employee**,然後按“Enter”鍵。您將看到斷點在 Index 操作方法中被命中。

Breakpoint is Hit

按“F5”鍵繼續,您將在檢視中看到從資料庫檢索的員工列表。

List of Employees Retrieved

在 60 秒內再次重新整理瀏覽器,您會發現這次斷點沒有被命中。這是因為我們使用了持續時間為 60 秒的輸出快取。因此,它將快取此結果 60 秒,當您重新整理瀏覽器時,它將從快取獲取結果,並且不會從資料庫伺服器載入內容。

除了 duration 引數外,還可以與輸出快取一起使用其他設定選項。這些設定不僅適用於 MVC 框架,而且繼承自 ASP.Net 快取。

更改輸出快取

在某些情況下,您可能需要不同的快取版本,例如,當您建立詳細資訊頁面時,單擊詳細資訊連結將獲得所選員工的詳細資訊。

但首先我們需要建立詳細資訊檢視。為此,右鍵單擊 EmployeeController 中的 Details 操作方法,然後選擇“新增檢視……”。

Create Detail View

您將看到預設情況下選擇了 Details 名稱。現在從“模板”下拉列表中選擇 Details,從“模型類”下拉列表中選擇 Employee。

Template Dropdown

單擊“新增”繼續,您將看到 Details.cshtml。

@model MVCSimpleApp.Models.Employee
@{
   Layout = null;
}

<!DOCTYPE html>
<html>
   <head>
      <meta name = "viewport" content = "width = device-width" />
      <title>Details</title>
   </head>
	
   <body>
      <div>
         <h4>Employee</h4>
         <hr />
         <dl class = "dl-horizontal">
            <dt>
               @Html.DisplayNameFor(model => model.Name)
            </dt>
				
            <dd>
               @Html.DisplayFor(model => model.Name)
            </dd>
				
            <dt>
               @Html.DisplayNameFor(model => model.JoiningDate)
            </dt>
				
            <dd>
               @Html.DisplayFor(model => model.JoiningDate)
            </dd>
				
            <dt>
               @Html.DisplayNameFor(model => model.Age)
            </dt>
				
            <dd>
               @Html.DisplayFor(model => model.Age)
            </dd>
				
         </dl>
      </div>
		
      <p>
         @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
         @Html.ActionLink("Back to List", "Index")
      </p>
		
   </body>
</html>

您可以利用 [OutputCache] 屬性的 VaryByParam 屬性。此屬性使您可以在表單引數或查詢字串引數變化時建立相同內容的不同快取版本。以下是 Details 操作的實現。

// GET: Employee/Details/5
[OutputCache(Duration = int.MaxValue, VaryByParam = "id")]

public ActionResult Details(int id){
   var employee = db.Employees.SingleOrDefault(e => e.ID == id);
   return View(employee);
}

編譯並執行上述程式碼後,透過指定 URL **https://:63004/employee** 將收到以下輸出。

Create New

單擊任何連結的“詳細資訊”連結,您將看到該特定員工的詳細資訊檢視。

Particular Employee Details

Details() 操作包含一個值為“Id”的 VaryByParam 屬性。當不同的 Id 引數值傳遞給控制器操作時,將生成 Details 檢視的不同快取版本。

重要的是要理解,使用 VaryByParam 屬性會導致更多快取。將為 Id 引數的每個不同版本建立 Details 檢視的不同快取版本。

快取配置檔案

您可以在 web.config 檔案中建立快取配置檔案。這是一種透過修改 [OutputCache] 屬性的屬性來配置輸出快取屬性的替代方法。它提供了一些重要的優勢,如下所示。

  • 控制控制器操作在一箇中心位置快取內容的方式。

  • 建立一個快取配置檔案並將該配置檔案應用於多個控制器或控制器操作。

  • 修改 web 配置檔案而無需重新編譯您的應用程式。

  • 停用已部署到生產環境的應用程式的快取。

讓我們來看一個建立 web.config 檔案中的快取配置檔案的簡單示例。<caching> 部分必須出現在 <system.web> 部分內。

<caching>
   <outputCacheSettings>
      <outputCacheProfiles>
         <add name = "Cache10Min" duration = "600" varyByParam = "none"/>
      </outputCacheProfiles>
   </outputCacheSettings>
</caching>

您可以使用 [OutputCache] 屬性將 Cache10Min 配置檔案應用於控制器操作,如下所示。

[OutputCache(CacheProfile = "Cache10Min")]

public ActionResult Index(){
   var employees = from e in db.Employees
   orderby e.ID
   select e;
   return View(employees);
}

執行此應用程式並指定以下 URL **https://:63004/employee**

Invoke Index Action

如果您如上所示呼叫 Index() 操作,則將返回相同的時間 10 分鐘。

廣告