共用方式為


快取部分的 ASP.NET 網頁

有時候快取整份網頁並不實際,網頁有些部分可能需要根據每項要求而動態建立。這些情況下,若您能夠先識別出網頁要求中那些相關的物件或資料需要大量伺服器資源來建構,會很有益。識別出這些項目後,您可將它們從網頁中隔離出來並建立在 Web Form 使用者控制項 中,在您指定的時間範圍內快取它們,即可節省伺服器資源。這就是所謂的片段快取。

您可使用這項技巧,把需要花費寶貴處理器時間建立的網頁部分 (例如資料庫查詢) 從網頁的其他部分區隔出來。您可以選擇在每次要求時,動態地產生需要較少伺服器資源的網頁部分。

一旦您辨識出需要快取的網頁部分,並建立封裝每個部分的使用者控制項,接著就必須決定使用者控制項的快取原則。在程式碼後置類別中建立使用者控制項時,您可以使用 @ OutputCache 指示詞以宣告方式設定這些原則,或使用 PartialCacheAttribute 類別以程式設計方式進行。

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

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

同樣的道理,如果您使用程式碼後置開發方法來開發使用者控制項,那麼將下列屬性放在類別宣告的中繼資料 (Metadata) 內時,控制項的一個版本可在輸出快取中儲存達 120 秒。

[PartialCaching(120)]
[Visual Basic]
<PartialCaching(120)>

使用上述任一技巧時,如果要求包含使用者控制項的網頁,則只會快取使用者控制項。

注意 如果為輸出快取指定的使用者控制項經過宣告並在網頁中使用,則 ASP.NET 網頁剖析器 (Parser) 會視使用者控制項建立的方式,為兩個物件型別的其中一個執行個體化。如果使用者控制項以宣告方式建立,就會加入 StaticPartialCachingControl 物件;如果使用者控制項是透過 LoadControl 方法以程式設計方式建立,則會加入 PartialCachingControl 物件。接著,在要求網頁時,剖析器會將物件放入邏輯位置,這個位置是未被快取的使用者控制項在網頁的控制項階層架構中佔用的位置。

如需可在網頁輸出上設定之屬性的詳細資訊,請參閱 @ OutputCache 指示詞的文件。如需開發使用者控制項的詳細資訊,請參閱 Web Form 使用者控制項

注意 既然您可將使用者控制項巢狀化至網頁上的其他伺服器控制項,您也可以把已經放入輸出快取的使用者控制項巢狀化;也就是說,您可以把輸出快取指示詞加入輸出快取網頁內的使用者控制項,或放在屬於另一個輸出快取使用者控制項內的使用者控制項。

使用片段快取的常見錯誤

您可以在指定給輸出快取的使用者控制項標記中宣告 ID 屬性,以設計使用者控制項的執行個體 (Instance);不過,您必須明確地驗證輸出快取中是否有使用者控制項,以確保程式碼能夠正常運作。

例如,如果您以宣告方式把 MyUserControlID 指派給使用者控制項,並把下列程式碼加入 .aspx 檔案的程式碼宣告區塊,即可檢查控制項是否存在。

void Page_Load() {
    if (MyUserControl != null)
       // Place code manipulating MyUserControl here.
}
[Visual Basic]
Sub Page_Load()
    If MyUserControl <> Null Then
       ' Place code manipulating MyUserControl here.
    End If  
End Sub

如果您撰寫程式碼來操作包含 @ OutputCache 指示詞的使用者控制項,便會發生錯誤。輸出快取的使用者控制項僅能在第一次要求時動態產生,任何後續要求都可在指定時間到期前由輸出快取提供。一旦決定使用者控制項已經執行個體化後,即可以程式設計方式從包含網頁來操作使用者控制項。您可以將這項邏輯加入與使用者控制項相關的其中一個網頁存留期事件中,例如放在 Page_Load 事件或 Page_PreRender 事件中。

您也應該瞭解包含輸出快取集的使用者控制項存在於已經有輸出快取集的 Web Form 網頁時會發生的情況。如果網頁輸出快取期間比使用者控制項輸出快取期間長,那麼網頁輸輸出快取期間對整個網頁都會生效,包含使用者控制項。例如,如果網頁輸出快取設定為 100 秒,而使用者控制項輸出快取設定為 50 秒,那麼整個網頁儲存在輸出快取的時間則為 100 秒,使用者控制項的較短設定時間不會造成影響。下列範例示範這項功能。

page01.aspx

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

<myControl:Time runat="server" /><br> <br> <br>

This page was most recently generated at:<p>

 <% DateTime t = DateTime.Now; 
    Response.Write(t); %>
[Visual Basic]
<%@ Register tagprefix="myControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>

<myControl:Time runat="server" /><br> <br> <br>

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

uc01.ascx

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

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

<% DateTime t = DateTime.Now; 
    Response.Write(t); %>
[Visual Basic]
<% @OutputCache duration="100" varybyparam="none" %>

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

然而,如果網頁輸出快取期間比使用者控制項輸出快取期間要短,則會使用快取的使用者控制項直到過期,而即使網頁的其他部份因為要求重新產生時也是一樣。例如,如果網頁輸出快取設定為 50 秒,而使用者控制項輸出快取設定為 100 秒,那麼使用者控制項每過期一次,網頁的其他部份就會過期兩次。下列簡單範例示範這項功能。

page02.aspx

<%@ Page language="C#" %>
<%@ Register tagprefix="myControl" tagname="Time" src="uc02.ascx" %>

<%@ OutputCache duration="50" varybyparam="none" %>

<myControl:Time runat="server" /><br> <br> <br>

This page was most recently generated at:<p>

 <% DateTime t = DateTime.Now; 
    Response.Write(t); %>
[Visual Basic]
<%@ Register tagprefix="myControl" tagname="Time" src="uc02.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>

<myControl:Time runat="server" /><br> <br> <br>

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

uc02.ascx

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

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

<% DateTime t = DateTime.Now; 
    Response.Write(t); %>
[Visual Basic]
<% @OutputCache duration="100" varybyparam="none" %>

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

請參閱

Web Form 使用者控制項 | 快取 ASP.NET 網頁 | @ OutputCache | ASP.NET 快取功能 | PartialCachingControl 類別 | 快取使用者控制項輸出的多個版本 | PartialCachingAttribute 類別 | UserControl 類別 | ASP.NET 最佳化