共用方式為


使用輸出快取改善效能 (VB)

Microsoft 提供

在本教學課程中,您將了解如何利用輸出快取來大幅改善 ASP.NET MVC Web 應用程式的效能。 您將了解如何快取從控制器動作傳回的結果,如此在每次新使用者叫用動作時,都不需要建立相同的內容。

本教學課程的目標是說明如何利用輸出快取,以大幅改善 ASP.NET MVC應用程式的效能。 輸出快取可讓您快取控制器動作傳回的內容。 如此一來,每次叫用相同的控制器動作時,都不需要產生相同的內容。

例如,假設您的 ASP.NET MVC 應用程式在名為 Index 的檢視中顯示資料庫記錄清單。 一般而言,每次使用者叫用傳回索引檢視的控制器動作時,必須藉由執行資料庫查詢,從資料庫擷取資料庫記錄集。

另一方面,如果利用輸出快取,則可以避免每次使用者叫用相同的控制器動作時執行資料庫查詢。 檢視可以從快取擷取,而不需從控制器動作重新產生。 利用快取可避免在伺服器上執行備援工作。

啟用輸出快取

您可以將 <OutputCache> 屬性新增至個別控制器動作或整個控制器類別,如此即可啟用輸出快取。 例如,清單 1 中的控制器會公開名為 Index() 的動作。 Index() 動作的輸出會快取 10 秒。

清單 1 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    <OutputCache(Duration:=10, VaryByParam:="none")> _
    Function Index()
        Return View()
    End Function

End Class

在 ASP.NET MVC 的 Beta 版本中,輸出快取不適用於類似 http://www.MySite.com/ 的 URL。 相反的,您必須輸入類似 `http://www.MySite.com/Home/Index' 的 URL。

在清單 1 中,Index() 動作的輸出快取 10 秒。 如果您願意,您可以指定更長的快取持續時間。 例如,如果您僅一天想要快取控制器動作的輸出,則可以指定快取持續時間為 86400秒 (60 秒 * 60 分鐘 * 24 小時)。

不保證內容會在您指定的時間量快取。 當記憶體資源變低時,快取會自動啟動收回內容。

清單 1 中的 Home 控制器會傳回清單 2 中的索引檢視。 此檢視沒有特別之處。 [索引] 檢視只顯示目前的時間 (參見圖 1)。

清單 2 – Views\Home\Index.aspx

<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <div>
    
    The current time is: <%= DateTime.Now.ToString("T") %>
    
    </div>
</body>
</html>

圖 1 – 快取索引檢視

clip_image002

如果您在瀏覽器的網址列中輸入 URL /Home/Index,並在瀏覽器中重複點擊 [重新整理/重載] 按鈕,多次叫用 Index() 動作,則 [索引] 檢視所顯示的時間在 10 秒內不會變更。 顯示相同時間,因為已快取檢視。

請務必了解,造訪您的應用程式的每一個人都會快取相同的檢視。 任何叫用 Index() 動作的人,都會取得相同的索引檢視快取版本。 這表示,Web 伺服器必須執行才能提供索引檢視的工作量已大幅減少。

清單 2 中的檢視剛好在做非常簡單的事。 檢視只顯示目前的時間。 然而,您可以同樣輕鬆地快取檢視,而該檢視顯示了一組資料庫記錄。 在此情況下,每次叫用傳回檢視的控制器動作時,都不需要從資料庫擷取資料庫記錄集。 快取可以減少 Web 伺服器和資料庫伺服器必須執行的工作量。

請勿在 MVC 檢視中使用頁面 <%@ OutputCache %> 指示詞。 這個指示詞會從 Web Forms 領域滲出,不應該在 ASP.NET MVC 應用程式中使用。

快取內容之處

根據預設,當您使用 <OutputCache> 屬性時,會在三個位置快取內容:Web 伺服器、任何 Proxy 伺服器和網頁瀏覽器。 您可以藉由修改 <OutputCache> 屬性的 Location 屬性,精確控制內容快取的位置。

您可以將 Location 屬性設定為下列其中一個值:

· Any

· Client

· Downstream

· Server

· None

·ServerAndClient

根據預設,Location 屬性具有 Any 值。 然而,在某些情況下,您可能只會想要在瀏覽器或伺服器上快取。 例如,若要快取為每個使用者個人化的資訊,則不應快取伺服器上的資訊。 如果您向不同的使用者顯示不同的資訊,則應只快取用戶端上的資訊。

例如,清單 3 中的控制器會公開名為 GetName() 的動作,以傳回目前的使用者名稱。 如果 Jack 登入網站並叫用 GetName() 動作,則動作會傳回字串 “Hi Jack”。 如果 Jill 隨後登入網站並叫用 GetName() 動作,則她也會取得字串 “Hi Jack”。 在 Jack 最初叫用控制器動作之後,會在 Web 伺服器上為所有使用者快取字串。

清單 3 – Controllers\BadUserController.vb

Public Class BadUserController
    Inherits System.Web.Mvc.Controller

    <OutputCache(Duration:=3600, VaryByParam:="none")> _
    Function Index()
        Return "Hi " & User.Identity.Name
    End Function

End Class

但很可能清單 3 中的控制器無法依您想要的方式運作。 您不想要對 Jill 顯示 "Hi Jack" 訊息。

您絕對不可以在伺服器快取中快取個人化內容。 不過,您可能會想要快取瀏覽器快取中的個人化內容,以改善效能。 如果您在瀏覽器中快取內容,而且使用者多次叫用相同的控制器動作,那麼便可以從瀏覽器快取擷取內容,而不是伺服器。

清單 4 中修改過的控制器會快取 GetName() 動作的輸出。 不過,內容只會在瀏覽器上快取,而不是在伺服器上快取。 如此一來,當多個使用者叫用 GetName() 方法時,每個人都會取得自己的使用者名稱,而不是另一個人的使用者名稱。

清單 4 – Controllers\UserController.vb

Public Class UserController
    Inherits System.Web.Mvc.Controller

    <OutputCache(Duration:=3600, VaryByParam:="none", Location:=OutputCacheLocation.Client, NoStore:=True)> _
    Function GetName()
        Return "Hi " & User.Identity.Name
    End Function

End Class

請注意,清單 4 中的 <OutputCache> 屬性包含設定為值 OutputCacheLocation.Client 的 Location 屬性。 <OutputCache> 屬性也包含 NoStore 屬性。 NoStore 屬性可用於通知 Proxy 伺服器和瀏覽器,它們不應儲存快取內容的永久複本。

改變輸出快取

在一些情況下,您可能會想要不同快取版本的相同內容。 例如,想像一下您要建立主版/詳細資料頁面。 主版頁面會顯示電影標題清單。 當按下標題時,您會取得所選電影的詳細資料。

如果快取詳細資料頁面,則不論按選哪部電影,都會顯示相同電影的詳細資料。 第一位使用者選取的第一部影片會向所有未來的使用者顯示。

您可以利用 <OutputCache> 屬性的 VaryByParam 屬性來修正此問題。 當表單參數或查詢字串參數改變時,這個屬性可讓您建立相同內容的不同快取版本。

例如,清單 5 中的控制器會公開兩個名為 Master() 和 Details() 的動作。 Master() 動作會傳回電影標題清單,而Details() 動作會傳回所選電影的詳細資料。

清單 5 – Controllers\MoviesController.vb

Public Class MoviesController
    Inherits System.Web.Mvc.Controller

    Private _dataContext As MovieDataContext

    Public Sub New()
        _dataContext = New MovieDataContext()
    End Sub

    <OutputCache(Duration:=Integer.MaxValue, VaryByParam:="none")> _
    Public Function Master()
        ViewData.Model = (From m In _dataContext.Movies _
                          Select m).ToList()
        Return View()
    End Function

    <OutputCache(Duration:=Integer.MaxValue, VaryByParam:="id")> _
    Public Function Details(ByVal id As Integer)
        ViewData.Model = _dataContext.Movies.SingleOrDefault(Function(m) m.Id = id)
        Return View()
    End Function

End Class

Master() 動作包含具有值 "none" 的 VaryByParam 屬性。 叫用 Master() 動作時,會傳回相同快取版本的 [主版] 檢視。 忽略任何表單參數或查詢字串參數 (請參閱圖 2)。

圖 2 – /Movies/Master 檢視

clip_image004

圖 3 – /Movies/Details 檢視

clip_image006

Details() 動作包含具有值 "Id" 的 VaryByParam 屬性。 當 Id 參數的不同值傳遞至控制器動作時,會產生不同的 [詳細資料] 檢視快取版本。

請務必了解,使用 VaryByParam 屬性會導致更多的快取,而不會更少。 系統會針對每個不同版本的 Id 參數,建立不同快取版本的 [詳細資料] 檢視。

您可以將 VaryByParam 屬性設定為下列值:

* = 每當表單或查詢字串參數不同時,建立不同的快取版本。

none = 永不建立不同的快取版本

參數分號清單 = 每當清單中的任何表單或查詢字串參數有所不同時,建立不同的快取版本

建立快取設定檔

除了修改 <OutputCache> 屬性 (attribute) 的屬性 (properties) 來設定輸出快取屬性,您也可以在 Web 組態 (web.config) 檔案中建立快取設定檔。 在 Web 組態檔中建立快取設定檔,這麼做有幾個重要的好處。

首先,藉由在 Web 組態檔中設定輸出快取,您可以控制如何讓控制器動作在一個中央位置快取內容。 您可以建立一個快取設定檔,並將設定檔套用至好幾個控制器或控制器動作。

其次,您可以修改 Web 組態檔,而不重新編譯您的應用程式。 如果您需要停用已部署至生產環境的應用程式快取,您可以直接修改 Web 組態檔中定義的快取設定檔。 系統會自動偵測 Web 組態檔的任何變更,並予以套用。

例如,清單 6 中的<快取> Web 組態區段會定義名為 Cache1Hour 的快取設定檔。 <快取> 區段必須出現在 Web 組態檔的 <system.web> 區段中。

清單 6 – web.config 的快取區段

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Cache1Hour" duration="3600" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

清單 7 中的控制器說明您可以如何使用 <OutputCache> 屬性,將 Cache1Hour 配置檔套用至控制器動作。

清單 7 – Controllers\ProfileController.vb

Public Class ProfileController
    Inherits System.Web.Mvc.Controller

    <OutputCache(CacheProfile:="Cache1Hour")> _
    Function Index()
        Return DateTime.Now.ToString("T")
    End Function

End Class

如果您在清單 7 中叫用控制器所公開的 Index() 動作,則會傳回相同的 1 小時的時間。

摘要

輸出快取可讓您輕鬆改善 ASP.NET MVC 應用程式的效能。 在本教學課程中,您已了解如何使用 <OutputCache> 屬性快取控制器動作的輸出。 您也了解如何修改 <OutputCache> 屬性 (attribute) 的屬性 (properties),例如 Duration 和 VaryByParam 屬性,以修改內容快取的方式。 最後,您了解如何在 Web 組態檔中定義快取設定檔。