国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
ASP.NET緩存全解析3:頁(yè)面局部緩存
 ASP.NET緩存全解析文章索引

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

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

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

  在ASP.NET中,提供了UserControl這種用戶控件的功能。一個(gè)頁(yè)面可以通過(guò)多個(gè)UserControl來(lái)組成。只需要在某個(gè)或某幾個(gè)UserControl里設(shè)置緩存。

  例如:

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

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

  調(diào)用該控件的頁(yè)面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.w3.org/1999/xhtml" >
<head runat="server">
<title>控件緩存</title>
</head>
<body>
<form id="form1" runat="server">
<div>
頁(yè)面的:
<%=DateTime.Now %>
</div>
<div>
控件的:
<uc1:WebUserControl1 ID="WebUserControl11" runat="server" />
</div>
</form>
</body>
</html>

   這時(shí)候刷新WebForm1.aspx頁(yè)面時(shí),頁(yè)面的時(shí)間每次刷新都變化,而用戶控件中的時(shí)間數(shù)據(jù)卻是60秒才變化一次,說(shuō)明對(duì)頁(yè)面的“局部”控件實(shí)現(xiàn)了緩存,而整個(gè)頁(yè)面不受影響。

  2. 緩存后替換

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

  如何實(shí)現(xiàn)緩存頁(yè)面的大部分內(nèi)容,而不緩存頁(yè)面中的局部某些片段。ASP.NET 2.0提供了緩存后替換功能。實(shí)現(xiàn)該項(xiàng)功能可通過(guò)以下三種方法:

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

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

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

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

  (1) Substitution控件應(yīng)用

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

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

  頁(yè)面后臺(tái)代碼:

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

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

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

  Ø  此方法必須接受HttpContext類型的參數(shù);

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

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

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

  隨著頁(yè)面的刷新,真實(shí)時(shí)間在變,而頁(yè)面緩存的時(shí)間在指定的緩存時(shí)間內(nèi)始終不變。

  注意:

  Ø  Substitution控件無(wú)法訪問(wèn)頁(yè)上的其他控件,也就是說(shuō),無(wú)法檢查或更改其他控件的值。但是,代碼確實(shí)可以使用傳遞給它的參數(shù)來(lái)訪問(wèn)當(dāng)前頁(yè)上下文。

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

  Ø  Substitution控件不會(huì)呈現(xiàn)任何標(biāo)記,其位置所顯示內(nèi)容完全取決于所定義方法的返回字符串。

  (2) Substitution控件API應(yīng)用

  上一小節(jié)介紹了以聲明方式使用Substitution控件實(shí)現(xiàn)緩存后替換的應(yīng)用。本節(jié)說(shuō)明另一種實(shí)現(xiàn)方法。該方法的核心是以編程方式利用Substitution控件API實(shí)現(xiàn)緩存后替換,相對(duì)于以聲明方式使用Substitution控件的方法具有更強(qiáng)靈活性。

  通過(guò)為Substitution指定回調(diào)方法,實(shí)現(xiàn)和聲明同樣的效果。Substitution的回調(diào)方法必須是

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

  Ø  一是返回值必須是String,

  Ø  二是參數(shù)有且僅有一個(gè),并且是HttpContext類型。

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

  需要注意的是,回調(diào)方法必須是線程安全的,可以是作為容器的頁(yè)面或者用戶控件中的靜態(tài)方法,也可以是其他任意對(duì)象上的靜態(tài)方法或?qū)嵗椒ā?/p>

  下面演示一個(gè)以編程方式將 Substitution 控件添加到輸出緩存網(wǎng)頁(yè)。與(1)Substitution控件應(yīng)用所示的示例完成同樣功能。不同的是實(shí)現(xiàn)方式。

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

 

   頁(yè)面后臺(tái)CS代碼: 

protected void Page_Load(object sender, EventArgs e)
{
//創(chuàng)建一個(gè)Substitution
Substitution Substitution1 = new Substitution();
//指定調(diào)用的回調(diào)方法名
Substitution1.MethodName = "GetCurrentDateTime";
PlaceHolder1.Controls.Add(Substitution1);
Label1.Text
=DateTime.Now.ToString();
}
public static string GetCurrentDateTime(HttpContext context)
{
return DateTime.Now.ToString();
}
  如上代碼所示,頁(yè)面使用@ OutputCache指令設(shè)置了輸出緩存功能,其配置數(shù)據(jù)緩存過(guò)期時(shí)間為60秒。然而,頁(yè)面其他內(nèi)容都被緩存,通過(guò)Substitution調(diào)用的回調(diào)方法顯示的內(nèi)容是不被緩存的。 
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
.net緩存技術(shù)詳解
Substitution控件
整理了一下MSDN中關(guān)于ASP.NET緩存機(jī)制的論述 - qdzx2008的專欄 - CS...
UpdatePanel終于可以上傳文件了!
將 JavaScript 與 ASP.NET 2.0 配合使用
asp.net夜話之五:Page類和回調(diào)技術(shù)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服