共用方式為


ASP.NET Web 網頁的快取部分

更新:2007 年 11 月

有時候快取整份網頁並不實際,因為網頁有些部分可能需要根據各項要求而變更。在這些情況下,您可以僅快取一部分的網頁。有兩個選項可以這麼做:控制項快取和快取後替換。

在控制項快取 (亦稱片段快取) 中,您可藉由建立使用者控制項以包含快取內容,然後將使用者控制項標示為可快取,以便快取部分的網頁輸出。這樣允許在每一次重新建立整個網頁時,快取網頁裡的特定內容。例如,如果要建立會顯示大量動態內容 (例如股票資訊) 的網頁,且要同時擁有靜態區段 (例如一週摘要),您可以在使用者控制項中建立靜態區段,並設定所要快取的使用者控制項。

快取後置替換則剛好相反。仍會快取網頁,但網頁裡的片段是動態的,因此不會快取。例如,如果要建立一個在設定期間內完全靜態的網頁 (如新聞內文網頁),您可以設定快取整個網頁。如果在快取的網頁中加入旋轉的廣告橫幅,則它們在網頁要求期間不會產生變更。不過,使用快取後替換雖然可以快取網頁,但您仍可以將特定部分標記為無法快取。在這範例中,可以標記廣告橫幅為無法快取。在每一個網頁要求中將以動態建立,並加入至快取網頁輸出。如需更多快取後置替換的詳細資訊,請參閱動態更新快取頁面的部分內容

控制項快取

建立使用者控制項以快取內容,可讓您把需要花費寶貴處理器時間建立的網頁部分 (例如資料庫查詢) 從網頁的其他部分區隔出來。需要較少伺服器資源的網頁部分則可在每個要求動態產生。

在識別出需要快取的網頁部分,並建立包含所有這些部分的使用者控制項之後,您必須判斷使用者控制項的快取原則。可以以宣告方式使用 @ OutputCache 指示詞,或在使用者控制項程式碼中使用 PartialCachingAttribute 類別來設定這些原則。

例如,如果您將下列指示詞包含在使用者控制項檔案 (.ascx 檔) 的頂端,則控制項的版本會在輸出快取內儲存 120 秒。

<%@ OutputCache Duration="120" VaryByParam="None" %>

如果要在程式碼中設定快取參數,可以在使用者控制項的類別宣告中使用屬性。例如,如果在類別宣告的中繼資料中包含以下屬性,則內容的版本會在輸出快取內儲存 120 秒:

[PartialCaching(120)]
public partial class CachedControl : System.Web.UI.UserControl
{
    // Class Code
}
<PartialCaching(120)> _
Partial Class CachedControl
    Inherits System.Web.UI.UserControl
    ' Class Code
End Class

如需設定網頁輸出屬性的詳細資訊,請參閱 @ OutputCache 主題。如需如何開發使用者控制項的詳細資訊,請參閱 ASP.NET Web 伺服器控制項概觀

注意事項:

因為可以將使用者控制項巢狀化至網頁,所以也可以同時把已置入輸出快取的使用者控制項巢狀化。您可以為網頁和巢狀使用者控制項指定不同的快取設定。

以程式設計的方式參考快取的使用者控制項

當以宣告方式建立可快取的使用者控制項時,可包含 ID 屬性,以程式設計的方式參考該使用者控制項的執行個體。不過,在程式碼中參考使用者控制項之前,必須在輸出快取中確認使用者控制項是否存在。快取的使用者控制項僅能在第一次要求時動態產生,任何後續要求則可在指定時間過期前由輸出快取滿足。在您決定使用者控制項已個體化之後,可以用程式設計方式管理包含網頁的使用者控制項。例如,若您以宣告方式將 SampleUserControl 的 ID 指派給使用者控制項,則可以用下列程式碼檢查它是否存在:

protected void Page_Load(object sender, EventArgs e)
{
    if (SampleUserControl != null)
       // Place code manipulating SampleUserControl here.
}
Protected Sub Page_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Me.Load
    If SampleUserControl <> Nothing Then
       ' Place code manipulating SampleUserControl here.
    End If
End Sub

快取不同期間的網頁與使用者控制項

可以針對網頁或網頁上的使用者控制項,設定不同的輸出快取期間值。如果網頁輸出快取期間比使用者控制項輸出快取期間長,網頁輸出快取期間將取得優先權。例如,如果網頁輸出快取設定為 100 秒,而使用者控制項輸出快取設定為 50 秒,則整個網頁 (包括使用者控制項) 會儲存在輸出快取的時間為 100 秒,而不論使用者控制項的設定較短。

下列程式碼範例會顯示網頁快取期間比使用者控制項快取期間更長時的效果。網頁設定快取為 100 秒。

<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

下列程式碼範例會顯示包含在網頁中的使用者控制項。控制項的快取期間設定為 50 秒。

<% @Control language="C#" %>
<% @OutputCache duration="50" varybyparam="none" %>

This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="50" varybyparam="none" %>

This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

如果網頁輸出快取期間比使用者控制項還要短,則使用者控制項將會進行快取直到期間過期為止,即使網頁的其他部分已於要求時重新產生也一樣。例如,如果網頁輸出快取設定為 50 秒,而使用者控制項的輸出快取設定為 100 秒,那麼每當網頁的其他部分過期兩次時,使用者控制項就會過期一次。

在下列程式碼中,示範了包含快取期間較網頁為長之使用者控制項的網頁標記。網頁設定快取為 50 秒。

<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>
 <% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="Uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>
 <% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

在下列程式碼中,示範了包含在網頁中的使用者控制項。控制項快取期間設定為 100 秒。

<% @Control language="C#" %>
<% @OutputCache duration="100" varybyparam="none" %>

This user control was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="100" varybyparam="none" %>

This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

請參閱

概念

ASP.NET 快取概觀

動態更新快取頁面的部分內容

快取網頁的多個版本

快取應用程式資料

ASP.NET 的快取組態

其他資源

ASP.NET 快取的新功能