ASP.NET 2.0的頁面緩衝功能介紹

來源:互聯網
上載者:User
asp.net|緩衝|頁面

  頁面部分緩衝是指輸出快取頁面面的某些部分,而不是緩衝整個頁面內容。實現頁面部分緩衝有兩種機制:一種是將頁面中需要緩衝的部分置於使用者控制項(.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類可在使用者控制項的程式碼後置檔案中設定有關控制項緩衝的配置內容。此處應重點瞭解PartialCachingAttribute類的6個常用屬性和4種類建構函式。6個常用屬性是Duration、Shared、SqlDependency、VaryByControl、VaryByCustom和VaryByParam。這與上文所示的控制項緩衝@ OutputCache指令設定的6個屬性完全相同,只是所使用的方式不同。在此不對這6個屬性重複介紹。下面重點說明PartialCachingAttribute類的4種建構函式,這對於使用該類有著重要意義。

   [PartialCaching(int duration)]

  這是最為常用的一種格式。其參數duration為整數類型,用於設定使用者控制項緩衝有效期間時間值。該參數與@ OutputCache指令中的Duration屬性對應。

   [PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom)]

  這種格式設定的內容較多。參數duration與上面說明的相同。參數varyByParams是一個由分號分隔的字串列表,用於使輸出緩衝發生變化。該參數與@ OutputCache指令中的VaryByParam屬性對應。參數varyByControls是一個由分號分隔的字串列表,用於使輸出緩衝發生變化,其與@ OutputCache指令中的VaryByControl屬性對應。參數varyByCustom用於設定任何錶示自訂輸出緩衝要求的文本,與@ OutputCache指令中的VaryByCustom屬性對應。

   [PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom, bool shared)]

  這種格式中,參數duration、varyByParams、varyByControls、varyByCustom都與上面說明的參數相同。只有參數shared是新添加的。參數shared值是一個布爾值,用於確定使用者控制項輸出緩衝是否可以由多個頁面共用。預設值為false。當該參數設定為true,表示使用者控制項輸出緩衝可以被多個頁面共用,可以潛在節省大量記憶體。

   [PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom, string sqlDependency, bool shared)]

  以上格式中添加了一個新參數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。

   Cached屬性

  用於擷取或者設定一個布爾值,表示是否在使用者控制項中啟用控制項緩衝功能。true表示啟用控制項緩衝功能,否則為false。

   Dependency屬性

  用於擷取或者設定一個CacheDependency執行個體對象,該對象與使用者控制項的輸出緩衝關聯。預設值為null。當CacheDependency執行個體對象失效時,使用者控制項的輸出緩衝將從緩衝中移除。

   Duration屬性

  擷取或者設定一個TimeSpan結構,表示使用者控制項輸出緩衝的有效時間。預設值為Zero。

   SupportsCaching屬性

  該屬性擷取一個布爾值,用於表示使用者控制項是否支援緩衝功能。如果屬性值為true,則表示該使用者控制項支援緩衝;否則為false。

   VaryByControl屬性

  用於擷取或者設定一個由分號分隔的字串列表,這些字串包含在使用者控制項中聲明的伺服器控制項ID屬性值。可根據該屬性值,使輸出緩衝發生變化。

   VaryByParams屬性

  用於擷取或者設定一個由分號分隔的字串列表。預設情況下,這些字串與用GET方法屬性發送的查詢字串值對應,或與用POST方法發送的參數對應。使用者控制項可根據該屬性值,使輸出緩衝發生變化。

  另外,ControlCachePolicy類還包括3個常用方法,SetExpires、SetSlidingExpiration和SetVaryByCustom。

   public void SetExpires(DateTime expirationTime);

  指示使用者控制項輸出緩衝入口在特定的時間內到期。可使用和參數設定為的SetSlidingExpiration方法指示使用者控制項輸出緩衝使用可調到期策略。如果SetSlidingExpiration方法的參數設定為false,則使用者控制項輸出緩衝使用絕對到期策略。

   public void SetSlidingExpiration(bool useSlidingExpiration);

  指示使用者控制項緩衝入口使用Sliding到期策略,或者Absolute到期策略。當參數useSlidingExpiration設定為true時,則使用者控制項輸出緩衝使用Sliding到期策略。否則,使用Absolute到期策略。

   public void SetVaryByCustom(string varyByCustom);

  用於自訂使用者控制項輸出緩衝使用的任意文本。如果該屬性值是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方法的返回對象不是Null 參考,而是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控制項的緩衝後替換

  是一個直接支援緩衝替換功能的控制項。如果將控制項放在頁面上,則無論是否緩衝父頁,都將在每次請求時呈現其特有的廣告。例如,如果頁麵包含靜態內容(如新聞報道)和顯示廣告的控制項,這種情況下,此緩衝模型就很有用。新聞報道不會更改,這意味著它們可以緩衝。但是,應用程式要求在每次請求該頁時都顯示一條新廣告。由於控制項直接支援緩衝後替換,因此,無論頁是否緩衝,都在該頁回傳時呈現一個新廣告。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.