<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      李天平的博客


      天道酬勤
        博客園  :: 首頁  :: 新隨筆  :: 聯系 :: 訂閱 訂閱  :: 管理

      系統緩存全解析3:頁面局部緩存

      Posted on 2009-06-30 23:12  李天平  閱讀(4804)  評論(0)    收藏  舉報

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

       

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

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

          在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.w3.org/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. 緩存后替換

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

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

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

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

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

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

       

      (1) Substitution控件應用

           為提高應用程序性能,可能會緩存整個ASP.NET頁面,同時,可能需要根據每個請求來更新頁面上特定的部分。例如,可能要緩存頁面的很大一部分,需要動態更新該頁上與時間或者用戶高度相關的信息。在這種情況下,推薦使用Substitution控件。Substitution控件能夠指定頁面輸出緩存中需要以動態內容替換該控件的部分,即允許對整頁面進行輸出緩存,然后,使用Substitution控件指定頁中免于緩存的部分。需要緩存的區域只執行一次,然后從緩存讀取,直至該緩存項到期或被清除。動態區域,也就是Substitution控件指定的部分,在每次請求頁面時都執行。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.w3.org/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控件執行時為回調而調用的方法名稱。該方法比較特殊,必須符合以下3條標準:

      ?  此方法必須被定義為靜態方法;

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

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

       

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

       

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

      示例效果,如圖15-2所示:

      15-2  緩存后替換

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

       

       

      注意:

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

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

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

       

      (2) Substitution控件API應用

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

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

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

      l  一是返回值必須是String

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

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

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

       

      下面演示一個以編程方式將 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.w3.org/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)

      {

          //創建一個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調用的回調方法顯示的內容是不被緩存的。

       

      主站蜘蛛池模板: av一区二区中文字幕| 天堂网亚洲综合在线| 亚洲熟妇自偷自拍另欧美| 国产欧美亚洲精品第一页在线| 久久人妻无码一区二区| 少妇xxxxx性开放| 成年无码av片在线蜜芽| 搡bbbb搡bbb搡| 万年县| 激情五月天一区二区三区| 妖精视频亚州无吗高清版| 尹人香蕉久久99天天拍| 国产69精品久久久久人妻刘玥| 国产福利社区一区二区| 亚洲一区二区三区av无码| 日本道播放一区二区三区| 在线看无码的免费网站| 晋州市| 国产精品户外野外| 激,情四虎欧美视频图片| 亚洲中文字幕无码爆乳| 国内视频偷拍久久伊人网| 人人妻人人妻人人片av| 狠狠人妻久久久久久综合蜜桃 | 亚洲区色欧美另类图片| 临桂县| 激情在线网| 亚洲一区二区视频在线观看| 国产成人一区二区不卡| 国产精品白浆免费视频| 久久久久青草线综合超碰| 国产精品欧美福利久久| 亚洲日本va午夜中文字幕久久| 五月婷婷开心中文字幕| 亚洲男人电影天堂无码| 亚洲人成电影网站色mp4| 国产爆乳无码av在线播放| 亚洲色大成网站www永久一区| 一本精品99久久精品77| 精品国产三级a∨在线欧美| 亚洲精品自拍视频在线看|