久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

ASP.NET緩存全解析3:頁面局部緩存

 昵稱597197 2011-05-14
 ASP.NET緩存全解析文章索引

  有時緩存整個頁面是不現實的,因為頁的某些部分可能在每次請求時都需要變化,。在這些情況下,,只能緩存頁的一部分。顧名思義,,頁面部分緩存是將頁面部分內容保存在內存中以便響應用戶請求,,而頁面其他部分內容則為動態(tài)內容。頁面部分緩存的實現包括兩種方式:控件緩存和替換后緩存,。

  1. 控件緩存(也稱為片段緩存) 

  這種方式允許將需要緩存的信息包含在一個用戶控件內,,然后,將該用戶控件標記為可緩存的,,以此來緩存頁面輸出的部分內容,。該選項允許緩存頁面中的特定內容,而沒有緩存整個頁面,,因此,,每次都需重新創(chuàng)建整個頁。例如,,如果要創(chuàng)建一個顯示大量動態(tài)內容(如股票信息)的頁,其中有些部分為靜態(tài)內容(如每周總結),,這時可以將靜態(tài)部分放在用戶控件中,,并允許緩存這些內容。 

  在ASP.NET中,,提供了UserControl這種用戶控件的功能,。一個頁面可以通過多個UserControl來組成。只需要在某個或某幾個UserControl里設置緩存,。

  例如:

  那么可以在WebUserControl1.ascx的頁頭代碼中添加聲明語句:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="CacheWebApp._16_4_5.WebUserControl1" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
<%=DateTime.Now %>

  調用該控件的頁面WebForm1.aspx代碼:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CacheWebApp._16_4_5.WebForm1" %>
<%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>
<html xmlns="http://www./1999/xhtml" >
<head runat="server">
<title>控件緩存</title>
</head>
<body>
<form id="form1" runat="server">
<div>
頁面的:
<%=DateTime.Now %>
</div>
<div>
控件的:
<uc1:WebUserControl1 ID="WebUserControl11" runat="server" />
</div>
</form>
</body>
</html>

   這時候刷新WebForm1.aspx頁面時,,頁面的時間每次刷新都變化,而用戶控件中的時間數據卻是60秒才變化一次,,說明對頁面的“局部”控件實現了緩存,,而整個頁面不受影響。

  2. 緩存后替換

  與控件緩存正好相反,。它對整個頁面進行緩存,,但是頁中的某些片段是動態(tài)的,,因此不會緩存這些片段。ASP.NET頁面中既包含靜態(tài)內容,,又包含基于數據庫數據的動態(tài)內容,。靜態(tài)內容通常不會發(fā)生變化。因此,,對靜態(tài)內容實現數據緩存是非常必要的,。然而,那些基于數據的動態(tài)內容,,則不同,。數據庫中的數據可能每時每刻都發(fā)生變化,因此,,如果對動態(tài)內容也實現緩存,,可能造成數據不能及時更新的問題。對此問題如果使用前文所述的控件緩存方法,,顯然不切實際,,而且實現起來很繁瑣,易于發(fā)生錯誤,。

  如何實現緩存頁面的大部分內容,,而不緩存頁面中的局部某些片段。ASP.NET 2.0提供了緩存后替換功能,。實現該項功能可通過以下三種方法:

  一是以聲明方式使用Substitution控件,。

  二是以編程方式使用Substitution控件API

  三是以隱式方式使用控件,。

  前兩種方法的核心是Substitution控件,,本節(jié)將重點介紹該控件,第三種方法僅專注于控件內置支持的緩存后替換功能,,本節(jié)僅做簡要說明,。

  (1) Substitution控件應用

  為提高應用程序性能,可能會緩存整個ASP.NET頁面,,同時,,可能需要根據每個請求來更新頁面上特定的部分。例如,,可能要緩存頁面的很大一部分,,需要動態(tài)更新該頁上與時間或者用戶高度相關的信息。在這種情況下,,推薦使用Substitution控件,。Substitution控件能夠指定頁面輸出緩存中需要以動態(tài)內容替換該控件的部分,即允許對整頁面進行輸出緩存,,然后,,使用Substitution控件指定頁中免于緩存的部分,。需要緩存的區(qū)域只執(zhí)行一次,然后從緩存讀取,,直至該緩存項到期或被清除,。動態(tài)區(qū)域,也就是Substitution控件指定的部分,,在每次請求頁面時都執(zhí)行,。Substitution控件提供了一種緩存部分頁面的簡化解決方案。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="CacheWebApp._16_4_5.WebForm2" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
<html xmlns="http://www./1999/xhtml" >
<head runat="server">
<title>緩存后替換示例</title>
</head>
<body>
<form id="form1" runat="server">
<div>
頁面緩存的時間:
<%= DateTime.Now.ToString() %>
</div>
<div>
真實(替換)的時間:
<asp:Substitution ID="Substitution1" runat="server" MethodName="getCurrentTime" />
</div>
</form>
</body>
</html>

  頁面后臺代碼:

public partial class WebForm2 : System.Web.UI.Page
{
public static string getCurrentTime(HttpContext context)
{
return DateTime.Now.ToString();
}
}

  如上代碼所示,,Substitution控件有一個重要屬性:MethodName,。該屬性用于獲取或者設置當Substitution控件執(zhí)行時為回調而調用的方法名稱。該方法比較特殊,,必須符合以下3條標準:

  Ø  此方法必須被定義為靜態(tài)方法,;

  Ø  此方法必須接受HttpContext類型的參數;

  Ø  此方法必須返回String類型的值,。

  在運行情況下,,Substitution控件將自動調用MethodName屬性所定義的方法。該方法返回的字符串即為要在頁面中的Substitution控件的位置上顯示的內容,。如果頁面設置了緩存全部輸出,,那么在第一次請求時,該頁將運行并緩存其輸出,。對于后續(xù)的請求,,將通過緩存來完成,該頁上的其他代碼不會再運行,。但Substitution控件及其有關方法則在每次請求時都執(zhí)行,,并且自動更新該控件所表示的動態(tài)內容,這樣就實現了整體緩存,,局部變化的替換效果,。

   如上代碼所示,在代碼頭部通過@ OutputCache指令設置頁面輸出緩存過期時間為5秒,,這意味著整個頁面數據都應用了緩存功能。因此,,“頁面緩存的時間”所顯示的時間值來自于數據緩存,。這個時間值不會隨著刷新頁面而變化,僅當緩存過期時才會發(fā)生更新,。Substitution控件的MethodName屬性值為getCurrentTime,。該控件顯示的內容來自于getCurrentTime方法的返回值。尤為重要的是,,雖然頁面設置了輸出緩存功能,,但是每當頁面刷新時,,ASP.NET執(zhí)行引擎仍然要重新執(zhí)行Substitution控件,并將MethodName屬性值指定的方法返回值顯示在頁面上,,因此,,顯示的是當前最新時間。

  隨著頁面的刷新,,真實時間在變,,而頁面緩存的時間在指定的緩存時間內始終不變。

  注意:

  Ø  Substitution控件無法訪問頁上的其他控件,,也就是說,,無法檢查或更改其他控件的值。但是,,代碼確實可以使用傳遞給它的參數來訪問當前頁上下文,。

  Ø  在緩存頁包含的用戶控件中可以包含Substitution控件。但是,,在輸出緩存用戶控件中不能放置Substitution控件,。

  Ø  Substitution控件不會呈現任何標記,其位置所顯示內容完全取決于所定義方法的返回字符串,。

  (2) Substitution控件API應用

  上一小節(jié)介紹了以聲明方式使用Substitution控件實現緩存后替換的應用,。本節(jié)說明另一種實現方法。該方法的核心是以編程方式利用Substitution控件API實現緩存后替換,,相對于以聲明方式使用Substitution控件的方法具有更強靈活性,。

  通過為Substitution指定回調方法,實現和聲明同樣的效果,。Substitution的回調方法必須是

  HttpResponseSubstitutionCallback委托定義的方法,,它有兩個特征:

  Ø  一是返回值必須是String

  Ø  二是參數有且僅有一個,,并且是HttpContext類型,。

  當需要以編程方式,為緩存的輸出響應動態(tài)生成指定的響應區(qū)域時,,可以在頁面代碼中將某個方法(即回調方法)的名稱作為參數(HttpResponseSubstitutionCallback)傳遞給Substitution,。這樣Substitution就能夠使用回調方法,并將回調方法的返回值作為給定位置的替代內容顯示出來,。

  需要注意的是,,回調方法必須是線程安全的,可以是作為容器的頁面或者用戶控件中的靜態(tài)方法,,也可以是其他任意對象上的靜態(tài)方法或實例方法,。

  下面演示一個以編程方式將 Substitution 控件添加到輸出緩存網頁。與(1)Substitution控件應用所示的示例完成同樣功能。不同的是實現方式,。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" Inherits="CacheWebApp._16_4_5.WebForm3" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
<html xmlns="http://www./1999/xhtml">
<head runat="server">
<title>緩存后替換-Substitution控件API應用</title>
</head>
<body>
<form id="form1" runat="server">
<div>
頁面緩存的時間:
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
<div>
真實(緩存替換)的時間:
<asp:PlaceHolder ID="PlaceHolder1" runat="Server"></asp:PlaceHolder>
</div>
</form>
</body>
</html>

 

   頁面后臺CS代碼: 

protected void Page_Load(object sender, EventArgs e)
{
//創(chuàng)建一個Substitution
Substitution Substitution1 = new Substitution();
//指定調用的回調方法名
Substitution1.MethodName = "GetCurrentDateTime";
PlaceHolder1.Controls.Add(Substitution1);
Label1.Text
=DateTime.Now.ToString();
}
public static string GetCurrentDateTime(HttpContext context)
{
return DateTime.Now.ToString();
}
  如上代碼所示,,頁面使用@ OutputCache指令設置了輸出緩存功能,其配置數據緩存過期時間為60秒,。然而,,頁面其他內容都被緩存,通過Substitution調用的回調方法顯示的內容是不被緩存的,。 

    本站是提供個人知識管理的網絡存儲空間,,所有內容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現有害或侵權內容,,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多