ASP.NET2.0的頁面緩存功能介紹
![]() | ||||
教程推薦 | ||||
| ||||
精彩專題 | ||||
| ||||
主題社區 | ||||
|
頁面部分緩存是指輸出緩存頁面的某些部分,而不是緩存整個頁面內容。實現頁面部分緩存有兩種機制:一種是將頁面中需要緩存的部分置于用戶控件(.ascx文件)中,并且為用戶控件設置緩存功能(包含用戶控件的ASP.NET頁面可設置也可不設置緩存)。這就是通常所說的“控件緩存”。設置控件緩存的實質是對用戶控件進行緩存配置。主要包括以下3種方法:一是使用@ OutputCache指令以聲明方式為用戶控件設置緩存功能,二是在代碼隱藏文件中使用PartialCachingAttribute類設置用戶控件緩存;三是使用ControlCachePolicy類以編程方式指定用戶控件緩存設置。另外,還有一種稱為“緩存后替換”的方法。該方法與控件緩存正好相反,將頁面中的某一部分設置為不緩存,因此,盡管緩存了整個頁面,但是當再次請求該頁時,將重新處理那些沒有設置為緩存的內容。
使用@ OutputCache指令
控件緩存與頁面輸出緩存的@ OutputCache指令既有相似之處,又有不同的方面。二者的共同點在于它們的設置方法基本相同,都是文件頂部設置包含屬性的@ OutputCache指令字符串。不同點包括以下兩個方面:一是控件緩存的@ OutputCache指令設置在用戶控件文件中,而頁面輸出緩存的@ OutputCache設置在普通ASP.NET文件中。二是控件緩存的@ OutputCache指令只能設置6個屬性,Duration、Shared、SqlDependency、VaryByControl、VaryByCustom和VaryByParam。而在頁面輸出緩存的@ OutputCache指令字符串中設置的屬性多達10個。以上是設置控件緩存時需要注意的問題。下面列舉了一些利用@ OutputCache指令設置控件緩存的示例,其中重點說明了VaryByParam和VaryByControl等屬性應用。
| 用戶控件中的@ OutputCache指令設置源代碼 |
<%@ OutputCache Duration="120" VaryByParam="CategoryID;SelectedID"%> |
以上代碼設置用戶控件緩存有效期時間是120秒,并且允許使用CategoryID和SelectedID參數來改變緩存。通過VaryByParam屬性設置,在服務器緩存中可能存儲多個用戶控件的實例。例如,對于一個包含用戶控件的頁面,可能存在如下的URL鏈接。
| 包含用戶控件的頁面的URL鏈接 |
http://localhost/mypage.aspx?categoryid=foo&selectedid=0 http://localhost/mypage.aspx?categoryid=foo&selectedid=1 |
當請求如上URL地址的頁面時,由于控件中@ OutputCache指令的設置,尤其是屬性VaryByParam的設置,那么在服務器緩存中就會存儲兩個版本的用戶控件緩存實例。
控件緩存設置除了支持以上所述VaryByParam屬性外,還支持VaryByControl屬性。VaryByParam屬性基于使用POST或者GET方式發送的名稱/值對來改變緩存,而VaryByControl屬性通過用戶控件文件中包含的服務器控件來改變緩存。下面是VaryByControl屬性的應用示例代碼。
| 用戶控件中的@ OutputCache指令設置源代碼 |
<%@ OutputCache Duration="120" VaryByParam="none" VaryByControl="Category" %> |
以上代碼設置緩存有效期是120秒,并且頁面不隨任何GET或POST參數改變(即使不使用VaryByParam屬性,但是仍然需要在@ OutputControl指令中顯式聲明該屬性)。如果用戶控件中包含ID屬性為“Category”的服務器控件(例如下拉框控件),那么緩存將根據該控件的變化來存儲用戶控件數據。
如果讀者已經掌握了頁面輸出緩存的@ OutputCache指令設置方法,那么控件緩存的@ OutputCache指令也會迎刃而解,無非僅使用其中的6個屬性而已。然而,可能會產生疑問:如果ASP.NET頁面和其中包含的用戶控件都通過@ OutputCache指令設置了緩存,那么緩存該如何運行呢?
遇到這個問題時,應掌握以下個基本原則:一是ASP.NET允許在頁面和頁面的用戶控件中同時使用@ OutputCache指令設置緩存,并且允許設置不同的緩存過期時間值。二是如果頁面輸出緩存過期時間長于用戶控件輸出緩存過期時間,則頁面的輸出緩存持續時間優先。例如,如果頁面輸出緩存設置為100秒,而用戶控件的輸出緩存設置為50秒,則包括用戶控件在內的整個頁將在輸出緩存中存儲100秒,而與用戶控件較短的時間設置無關。三是如果頁面輸出緩存過期時間比用戶控件的輸出緩存過期時間短,則即使已為某個請求重新生成該頁面的其余部分,也將一直緩存用戶控件直到其過期時間到期為止。例如,如果頁面輸出緩存設置為50秒,而用戶控件輸出緩存設置為100秒,則頁面其余部分每到期兩次,用戶控件才到期一次。
| 軟件頻道精品推薦 | |||
| | | |
| ![]() | | 更多精彩 |
使用PartialCachingAttribute類可在用戶控件的代碼隱藏文件中設置有關控件緩存的配置內容。此處應重點了解PartialCachingAttribute類的6個常用屬性和4種類構造函數。6個常用屬性是Duration、Shared、SqlDependency、VaryByControl、VaryByCustom和VaryByParam。這與上文所示的控件緩存@ OutputCache指令設置的6個屬性完全相同,只是所使用的方式不同。在此不對這6個屬性重復介紹。下面重點說明PartialCachingAttribute類的4種構造函數,這對于使用該類有著重要意義。
這是最為常用的一種格式。其參數duration為整數類型,用于設置用戶控件緩存有效期時間值。該參數與@ OutputCache指令中的Duration屬性對應。
這種格式設置的內容較多。參數duration與上面說明的相同。參數varyByParams是一個由分號分隔的字符串列表,用于使輸出緩存發生變化。該參數與@ OutputCache指令中的VaryByParam屬性對應。參數varyByControls是一個由分號分隔的字符串列表,用于使輸出緩存發生變化,其與@ OutputCache指令中的VaryByControl屬性對應。參數varyByCustom用于設置任何表示自定義輸出緩存要求的文本,與@ OutputCache指令中的VaryByCustom屬性對應。
這種格式中,參數duration、varyByParams、varyByControls、varyByCustom都與上面說明的參數相同。只有參數shared是新添加的。參數shared值是一個布爾值,用于確定用戶控件輸出緩存是否可以由多個頁面共享。默認值為false。當該參數設置為true,表示用戶控件輸出緩存可以被多個頁面共享,可以潛在節省大量內存。
以上格式中添加了一個新參數sqlDependency。用于設置用戶控件緩存入口所使用SQL Server緩存依賴功能的數據庫及表名。如果包含多個數據庫及表名,則使用分號(;)分隔開來。當該屬性值發生變化時,緩存入口將過期。另外,數據庫名必須與web.config文件中的<sqlcachedependency>配置節的內容匹配。
以上介紹了PartialCachingAttribute類的6個屬性和4種構造函數。下面通過一個典型示例說明該類的具體應用方法。例如,使用PartialCachingAttribute類設置用戶控件(NewUserControl.ascx文件)的緩存有效期時間是20秒,其代碼如下所示。
| 使用PartialCachingAttribute類實現設置用戶控件緩存 |
[PartialCaching(20)] public partial class NewUserControl : UserControl {......} |
以上代碼會存儲在NewUserControl.ascx.cs文件中。NewUserControl是用戶控件類,繼承自UserControl基類。當使用PartialCachingAttribute類設置該用戶控件緩存時,必須在控件類聲明前設置“[PartialCaching(......)]”。該代碼段可詳細設置用戶控件的緩存功能。例如,以上代碼設置了緩存有效時間為20秒。這與在NewUserControl.ascx文件頂部設置指令的Duration屬性值為20是一致的。
由于用戶控件應用了PartialCachingAttribute類(或者包含@ OutputCache指令),則ASP.NET分析器將生成PartialCachingControl類的實例來包裝該用戶控件。需要注意的是,此時生成PartialCachingControl類實例還有一個必要條件,即必須通過使用TemplateControl.LoadControl方法動態加載用戶控件,并且,將用戶控件插入頁面的控件層次結構中,這樣才會生成PartialCachingControl類實例。在通常情況下是不能直接使用PartialCachingControl類的。生成PartialCachingControl類實例能夠在運行時,獲取對用戶控件緩存設置的更大靈活性。
使用ControlCachePolicy類
ControlCachePolicy是.NET Framework 2.0中新出現的類,主要用于提供對用戶控件的輸出緩存設置的編程訪問。ControlCachePolicy類與前文說明的HttpCachePolicy類有些類似。只是二者所訪問的對象不同。HttpCachePolicy類用于訪問頁面輸出緩存,而ControlCachePolicy類用于訪問用戶緩存。
使用ControlCachePolicy類有以下注意事項。
一是如果要創建正確有效的ControlCachePolicy類實例以便設置控件緩存,那么必須訪問PartialCachingControl類的BasePartialCachingControl.CachePolicy屬性(BasePartialCachingControl是PartialCachingControl類的基類)。在這個過程中,需要調用LoadControl方法,實現動態加載用戶控件,這樣才能獲得為PartialCachingControl類包裝的用戶控件實例,進而利用其CachePolicy屬性獲取ControlCachePolicy實例。如果直接訪問用戶控件的UserControl.CachePolicy屬性,則只能在該用戶控件已由BasePartialCachingControl控件包裝的情況下,才能獲取有效的ControlCachePolicy實例。如果用戶控件未進行包裝,那么嘗試通過CachePolicy屬性獲取ControlCachePolicy實例將引發異常,因為它不具有關聯的BasePartialCachingControl。若要確定用戶控件實例是否支持緩存(而不生成異常),可檢查SupportsCaching屬性。
二是ControlCachePolicy實例僅在控件生命周期的Init和PreRender階段之間,才能成功操作。如果在PreRender階段后修改ControlCachePolicy對象,則ASP.NET會引發異常,因為呈現控件后所進行的任何更改,都無法影響緩存設置(控件在Render階段緩存)。以上內容說明最好在Page_Init事件處理程序中,創建并操作ControlCachePolicy實例。
下面首先講解ControlCachePolicy類的6個屬性,它們是Cached、Dependency、Duration、SupportsCaching、VaryByControl和VaryByParams。
用于獲取或者設置一個布爾值,表示是否在用戶控件中啟用控件緩存功能。true表示啟用控件緩存功能,否則為false。
用于獲取或者設置一個CacheDependency實例對象,該對象與用戶控件的輸出緩存關聯。默認值為null。當CacheDependency實例對象失效時,用戶控件的輸出緩存將從緩存中移除。
獲取或者設置一個TimeSpan結構,表示用戶控件輸出緩存的有效時間。默認值為Zero。
該屬性獲取一個布爾值,用于表示用戶控件是否支持緩存功能。如果屬性值為true,則表示該用戶控件支持緩存;否則為false。
用于獲取或者設置一個由分號分隔的字符串列表,這些字符串包含在用戶控件中聲明的服務器控件ID屬性值。可根據該屬性值,使輸出緩存發生變化。
用于獲取或者設置一個由分號分隔的字符串列表。默認情況下,這些字符串與用GET方法屬性發送的查詢字符串值對應,或與用POST方法發送的參數對應。用戶控件可根據該屬性值,使輸出緩存發生變化。
另外,ControlCachePolicy類還包括3個常用方法,SetExpires、SetSlidingExpiration和SetVaryByCustom。
指示用戶控件輸出緩存入口在特定的時間內過期。可使用和參數設置為的SetSlidingExpiration方法指示用戶控件輸出緩存使用可調過期策略。如果SetSlidingExpiration方法的參數設置為false,則用戶控件輸出緩存使用絕對過期策略。
指示用戶控件緩存入口使用Sliding過期策略,或者Absolute過期策略。當參數useSlidingExpiration設置為true時,則用戶控件輸出緩存使用Sliding過期策略。否則,使用Absolute過期策略。
用于自定義用戶控件輸出緩存使用的任意文本。如果該屬性值是browser,用戶控件輸出緩存將隨瀏覽器名稱和主要版本信息的不同而不同。如果輸入了自定義字符串,則必須在Global.asax文件中重寫HttpApplication.GetVaryByCustomString方法。
下面介紹一個典型示例,動態設置用戶控件緩存過期時間為30秒,并且使用絕對過期策略。用戶控件代碼隱藏文件源代碼如下。
| 使用PartialCachingAttribute類實現設置用戶控件緩存(用戶控件代碼隱藏文件) |
[PartialCaching(100)] public partial class SimpleControl : UserControl {......} |
如上代碼所示,用戶控件類名為SimpleControl,使用PartialCachingAttribute類設置默認的控件緩存過期時間為100秒。進行如此設置的目的是,實現使用PartialCachingAttribute類對用戶控件類的包裝,否則,在ASP.NET頁面中調用CachePolicy屬性獲取的ControlCachePolicy實例是無效的。也可以采用其他方法對用戶控件進行PartialCachingAttribute類包裝,例如,設置@ OutputCache指令等。
下面列舉ASP.NET頁面文件源代碼。
| 使用ControlCachePolicy類實現設置用戶控件緩存(ASP.NET頁面文件) |
<%@ Page Language="C#" Debug="true" %> <%@ Reference Control="SimpleControl.ascx" %> <script language="C#" runat="server"> void Page_Init(object sender, System.EventArgs e) { // 動態加載用戶控件,并返回PartialCachingControl的實例對象 PartialCachingControl pcc = LoadControl("SimpleControl.ascx") as PartialCachingControl; // 通過CachePolicy屬性獲取ControlCachePolicy實例 ControlCachePolicy cacheSettings = pcc.CachePolicy; // 如果用戶控件的緩存過期設置大于60秒,則設置新的過期時間為30秒,并將其設置為絕對過期策略 if (cacheSettings.Duration > TimeSpan.FromSeconds(60)) { // 設置用戶控件過期時間和緩存過期策略 cacheSettings.SetExpires(DateTime.Now.Add(TimeSpan.FromSeconds(30))); cacheSettings.SetSlidingExpiration(false); } // 將用戶控件添加到頁面控件層次結構中 Controls.Add(pcc); } </script> |
以上代碼是一個包含用戶控件SimpleControl.ascx的ASP.NET文件源代碼的一部分,主要以編程方式實現對用戶控件輸出緩存的設置。在整個實現過程中,由于需要設置用戶控件緩存,因此,必須在ASP.NET頁面的Page_Init事件處理程序中進行詳細設置。首先,使用TemplateControl.LoadControl方法動態加載SimpleControl..ascx文件。由于用戶控件SimpleControl..ascx已經為PartialCachingAttribute類包裝(這一步很關鍵),因此,LoadControl方法的返回對象不是空引用,而是PartialCachingControl實例。然后,使用PartialCachingControl實例對象的CachePolicy屬性,獲取ControlCachePolicy實例對象。該對象主要用于設置用戶控件輸出緩存的設置。接著,使用SetExpires方法和參數為false的SetSlidingExpiration方法,設置用戶控件輸出緩存有效期為30秒,并且設置緩存使用絕對過期策略。最后,利用Controls類的Add方法將設置好的用戶控件添加到頁面控件層次結構中。另外,@ Reference指令用于對用戶控件SimpleControl.ascx進行動態編譯和鏈接。
實現緩存后替換
ASP.NET頁面中既包含靜態內容,又包含基于數據庫數據的動態內容。靜態內容通常不會發生變化。因此,對靜態內容實現數據緩存是非常必要的。然而,那些基于數據的動態內容,則不同。數據庫中的數據可能每時每刻都發生變化,因此,如果對動態內容實現緩存,可能造成數據不能及時更新的問題。對此問題如果使用前文所述的控件緩存方法,顯然不切實際,而且實現起來很繁瑣,易于發生錯誤。
以上所述問題的本質是如何才能夠實現緩存頁面的大部分內容,而不緩存頁面中的某些片段。ASP.NET 2.0提供了緩存后替換功能。實現該項功能可通過以下三種方法:一是以聲明方式使用Substitution控件,二是以編程方式使用Substitution控件API,三是以隱式方式使用控件。前兩種方法的核心是Substitution控件,本節將重點介紹該控件,第三種方法僅專注于控件內置支持的緩存后替換功能,本節僅做簡要說明。
1.Substitution控件應用
為提高應用程序性能,可能會緩存整個ASP.NET頁面,同時,可能需要根據每個請求來更新頁面上特定的部分。例如,可能要緩存頁面的很大一部分,需要動態更新該頁上與時間或者用戶高度相關的信息。在這種情況下,推薦使用Substitution控件。Substitution控件能夠指定頁面輸出緩存中需要以動態內容替換該控件的部分,即允許對整頁面進行輸出緩存,然后,使用Substitution控件指定頁中免于緩存的部分。需要緩存的區域只執行一次,然后從緩存讀取,直至該緩存項到期或被清除。動態區域,也就是Substitution控件指定的部分,在每次請求頁面時都執行。Substitution控件提供了一種緩存部分頁面的簡化解決方案。
Substitution控件繼承自Control基類,其聲明代碼如下所示:
| Substitution控件聲明代碼 |
| <asp:substitution id="Substitution1" methodname=" " runat="Server"> </asp:substitution> |
如上代碼所示,Substitution控件有一個重要屬性––––MethodName屬性。該屬性用于獲取或者設置當Substitution控件執行時為回調而調用的方法名稱。該方法比較特殊,必須符合以下3條標準:此方法必須被定義為靜態方法;此方法必須接受HttpContext類型的參數;此方法必須返回String類型的值。
在運行情況下,Substitution控件將自動調用MethodName屬性所定義的方法。該方法返回的字符串即為要在頁面中的Substitution控件的位置上顯示的內容。如果頁面設置了緩存全部輸出,那么在第一次請求時,該頁將運行并緩存其輸出。對于后續的請求,將通過緩存來完成,該頁上的代碼不會運行。Substitution控件及其有關方法則在每次請求時都執行,并且自動更新該控件所表示的動態內容。
需要注意以下3點:一是Substitution控件無法訪問頁上的其他控件,也就是說,無法檢查或更改其他控件的值。但是,代碼確實可以使用傳遞給它的參數來訪問當前頁上下文。二是在緩存頁包含的用戶控件中可以包含Substitution控件。但是,在輸出緩存用戶控件中不能放置Substitution控件。三是Substitution控件不會呈現任何標記,其位置所顯示內容完全取決于所定義方法的返回字符串。
下面列舉了一個使用Substitution控件實現緩存后替換功能的示例。示例效果如圖3所示。

圖3 緩存后替換示例效果圖
應用程序包括兩個時間顯示。第一個時間顯示使用Substitution控件實現了緩存后替換功能,因此,每當單擊“刷新頁面”按鈕,其顯示的都是當前最新時間。第二個時間顯示應用了頁面輸出緩存,因此,其顯示時間僅當數據過期時才更新。
應用程序Default.aspx文件源代碼如下所示。
| Default.aspx文件源代碼 |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ OutputCache Duration="5" VaryByParam="None" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title>示例12-2</title> <link id="InstanceStyle" href="StyleSheet.css" type="text/css" rel="stylesheet" /> </head> <script runat="server" language="C#"> public void Page_Load(object sender, System.EventArgs e) { CachedDateLabel.Text = DateTime.Now.ToString(); } public static string GetCurrentDateTime(HttpContext context) { return DateTime.Now.ToString(); } </script> <body> <form id="form1" runat="server"> <div> <fieldset> <legend class="mainTitle">使用Substitution控件實現頁面部分緩存</legend> <br /> <div class="littleMainTitle">以下時間顯示使用Substitution控件實現緩存后替換:</div> <asp:Substitution ID="Substitution2" MethodName="GetCurrentDateTime" runat="Server"></asp:Substitution> <hr/> <div class="littleMainTitle">以下時間顯示使用頁面輸出緩存,緩存時間為5秒:</div> <asp:Label ID="CachedDateLabel" runat="Server"></asp:Label> <br /> <center><asp:Button ID="RefreshButton" Text="刷新頁面" runat="Server"></asp:Button></center> </fieldset> </div> </form> </body> </html> |
如上粗體代碼所示,頁面主要包括Substitution、Label和Button控件。在Page_Load事件處理程序中設置了Label控件顯示時間值。另外,還實現了一個靜態方法GetCurrentDateTime,該方法參數為HttpContext類型,返回值為String類型,其返回內容為當前時間。在代碼頂部通過@ OutputCache指令設置頁面輸出緩存過期時間為5秒,這意味著整個頁面數據都應用了緩存功能。因此,Label控件所顯示的時間值來自于數據緩存。這個時間值不會隨著刷新頁面而變化,僅當數據過期時才會發生更新。Substitution控件的MethodName屬性值為GetCurrentDateTime。該控件顯示的內容來自于GetCurrentDateTime方法的返回值。尤為重要的是,雖然頁面設置了輸出緩存功能,但是每當頁面刷新時,ASP.NET執行引擎仍然要重新執行Substitution控件,并將MethodName屬性值指定的方法返回值顯示在頁面上,因此,顯示的是當前時間值。
2.Substitution控件API應用
上一小節介紹了以聲明方式使用Substitution控件實現緩存后替換的應用。本節仍然圍繞實現緩存后替換功能,說明另一種實現方法。該方法的核心是以編程方式利用Substitution控件API實現緩存后替換,相對于以聲明方式使用Substitution控件的方法具有更強靈活性。
Substitution控件API包括一個關鍵的WriteSubstitution方法,該方法來自于HttpResponse類,其語法代碼如下:
| WriteSubstitution方法的語法 |
| public void WriteSubstitution (HttpResponseSubstitutionCallback callback) |
如上所示,WriteSubstitution方法僅有一個參數HttpResponseSubstitutionCallback。該參數是一個委托,其語法代碼如下:
| HttpResponseSubstitutionCallback委托的語法 |
| public delegate string HttpResponseSubstitutionCallback (HttpContext context) |
如上代碼所示,HttpResponseSubstitutionCallback委托定義的方法有兩個特征:一是返回值必須是String,二是參數有且僅有一個,并且是HttpContext類型。
以上介紹了WriteSubstitution方法及其參數的語法,這是使用WriteSubstitution方法實現緩存后替換的關鍵所在。
當需要以編程方式,為緩存的輸出響應動態生成指定的響應區域時,可以在頁面代碼中將某個方法(即回調方法)的名稱作為參數(HttpResponseSubstitutionCallback)傳遞給WriteSubstitution方法。這樣WriteSubstitution方法就能夠使用回調方法,并將回調方法的返回值作為給定位置的替代內容顯示出來。在這個過程中,回調方法的聲明是關鍵,不僅要采用單個HttpContext參數,而且必須返回一個字符串。需要注意的是,回調方法必須是線程安全的,可以是作為容器的頁面或者用戶控件中的靜態方法,也可以是其他任意對象上的靜態方法或實例方法。由此可見,使用WriteSubstitution方法的優點是可以調用任意對象的方法,而不只是調用Page或者UserControl對象的靜態方法。
在第一次請求頁面時,WriteSubstitution執行以下步驟:調用HttpResponseSubstitutionCallback委托以生成輸出;向響應添加替換緩沖數據,該緩沖區將保留委托(以對將來的請求調用)以及步驟一中的首次輸出;最后,將客戶端緩存能力從“公共”降?????? ?o??低到“僅服務器”,這樣頁面就不會在客戶端進行緩存,確保以后對該頁的請求將重新調用該委托,并生成動態內容。在后續請求時,緩存模塊截獲傳入的請求并檢索關聯的存儲緩沖區。在寫入替換緩沖區時,調用該委托以生成新的輸出,該輸出被寫入到響應中。
下面列舉了一個WriteSubstitution方法的應用示例,與圖12-3所示的示例完成同樣功能。不同的是實現方式。前文示例使用的是Substitution控件,而此處使用的是Substitution控件API的WriteSubstitution方法。應用程序Default.aspx文件部分源代碼如下:
Default.aspx文件部分源代碼 |
<%@ OutputCache Duration="5" VaryByParam="None" %> <head id="Head1" runat="server"> <title>示例12-3</title> <link id="InstanceStyle" href="StyleSheet.css" type="text/css" rel="stylesheet" /> </head> <script runat="server" language="C#"> ...... public static string GetCurrentDateTime(HttpContext context) { return DateTime.Now.ToString(); } </script> <body> <form id="form1" runat="server"> ...... <div class="littleMainTitle">以下時間顯示使用Substitution控件API實現緩存后替換:</div> <% Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetCurrentDateTime)); %> ...... </form> <body> |
如上粗體代碼所示,頁面使用@ OutputCache指令設置了輸出緩存功能,其配置數據緩存過期時間為5秒。然而,并非所有頁面內容都被緩存,部分內容是不被緩存的。不參與緩存的內容是代碼中通過調用Response.WriteSubstitution方法而獲取并顯示的返回字符串,顯示了當前時間。需要注意的是,Response.WriteSubstitution方法的參數,該參數必須是HttpResponseSubstitutionCallback委托實例。本例中,委托所定義的方法是GetCurrentDateTime,該方法是一個靜態方法,并且參數是HttpContext類型,返回值是String類型。
AdRotator控件的緩存后替換
是一個直接支持緩存替換功能的控件。如果將控件放在頁面上,則無論是否緩存父頁,都將在每次請求時呈現其特有的廣告。例如,如果頁面包含靜態內容(如新聞報道)和顯示廣告的控件,這種情況下,此緩存模型就很有用。新聞報道不會更改,這意味著它們可以緩存。但是,應用程序要求在每次請求該頁時都顯示一條新廣告。由于控件直接支持緩存后替換,因此,無論頁是否緩存,都在該頁回發時呈現一個新廣告。

