asp.net緩存(二)

ASP.NET頁面局部緩存

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

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

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

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

  例如:

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

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

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

復制代碼
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication2.WebForm2" %>
<%@ Register Src="~/WebUserControl1.ascx" TagName="WebUserControl1" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title></title>
</head>
<body><form id="form1" runat="server"><div><div>頁面的:<%=DateTime.Now %></div><div>控件的:<uc1:WebUserControl1 ID="WebUserControl11" runat="server" /></div></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="WebApplication2.WebForm2" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title></title>
</head>
<body><form id="form1" runat="server"><div><div>頁面緩存的時間:<%=DateTime.Now %></div><div>Substitution控件調用函數的時間:<asp:Substitution ID="Substitution1" runat="server" MethodName="getCurrentTime" /></div></div></form>
</body>
</html>
復制代碼
復制代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace WebApplication2
{public partial class WebForm2 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){}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屬性值指定的方法返回值顯示在頁面上,因此,顯示的是當前最新時間。

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

  注意:

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

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

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

  (2) Substitution控件API應用

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

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

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

  ?? 一是返回值必須是String

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

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

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

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

復制代碼
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication2.WebForm2" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title></title>
</head>
<body><form id="form1" runat="server"><div><div>頁面緩存的時間:<%=DateTime.Now %></div><div>Substitution控件API獲取的時間:<asp:PlaceHolder ID="PlaceHolder1" runat="Server"></asp:PlaceHolder></div></div></form>
</body>
</html>
復制代碼
復制代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace WebApplication2
{public partial class WebForm2 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){//創建一個Substitution    Substitution Substitution1 = new Substitution();    //指定調用的回調方法名    Substitution1.MethodName = "getCurrentTime";              PlaceHolder1.Controls.Add(Substitution1);           }public static string getCurrentTime(HttpContext context) { return DateTime.Now.ToString(); }}
}
復制代碼

  如上代碼所示,頁面使用@ OutputCache指令設置了輸出緩存功能,其配置數據緩存過期時間為60秒。然而,頁面其他內容都被緩存,通過Substitution調用的回調方法顯示的內容是不被緩存的。

轉載于:https://www.cnblogs.com/sumg/p/3962325.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260001.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260001.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習C# - Hello,World!

第一天學C#,開始學著寫一些學習筆記&#xff0c;看了一下傳智播客的視頻&#xff0c;按照傳智播客的教學順序&#xff0c;開始學習。 class Program{static void Main(string[] args){Console.WriteLine("Hello World!");//自動添加回車換行Console.Write("Hell…

android獲取button寬度,android – 如何獲得Button的高度和寬度

我創建了一系列按鈕.現在我想找到按鈕的高度和寬度,為此我使用了getWidth()和getHeight().但問題是它總是返回0.為什么會發生這種情況&#xff1f;我發送了我的代碼,請檢查是否有任何問題.int x,y;LinearLayout layoutVertical (LinearLayout) findViewById(R.id.liVLayout);L…

java執行sql列名無效_嵌套異常是java.sql.SQLException:無效的列名ORACLE

我嘗試在Java中使用JdbcTemplate執行以下oracle查詢&#xff1a;select RESOURCE_IDfrom REPRO_PRINTING_JOBwhere (USER_ID? and PRINTING_CENTER_ID?)group by RESOURCE_IDunion allselect RESOURCE_IDfrom REPRO_PRINTING_JOB_OLDwhere (USER_ID? and PRINTING_CENTER_ID…

(七)Maven使用的最佳實踐

這里說一下在使用Maven過程中不是必須的&#xff0c;但十分有用的幾個實踐&#xff0c;關鍵時刻或許能解決您的問題。 1.設置MAVEN_OPTS環境變量 通常需要設置MAVEN_OPTS的值為-Xms128m -Xmx512m&#xff0c;因為Java默認的最大可用內存往往不能夠滿足Maven運行的需要&#xff…

android beam傳輸速率,無線網絡的速率為何不能達到最大值

1、無線速率可以達到最大值&#xff0c;只是發送速率和傳輸流量是兩個概念&#xff0c;通俗點講&#xff0c;無線的發送速率是把信號以指定速率發出去(信號好的時候以高速率發&#xff0c;信號差的時候以低速率發)。傳輸流量是指單位時間內傳輸的數據量&#xff0c;大部分用戶關…

【SMTP 補錄 Apache服務】

【補錄&#xff0c;續】1.【配置空殼郵件接受】【mta】【前置&#xff1a;在/etc/named.rfc1912.zones 添加一個可以接受郵件的域hxl.org&#xff08;與你數據庫中寫的向對應&#xff09;,這個域的所在ip就是你機子的&#xff0c;因為要從你的機子轉發】 【配置該機的vim/etc/…

image打開rgb16 qt_QT中顯示圖像數據

一般圖像數據都是以RGBRGBRGB……字節流的方式(解碼完成后的原始圖像流)&#xff0c;我說成字節流&#xff0c;那就表明R&#xff0c;G&#xff0c;B的值各占一個字節&#xff0c;在編程時表示的就是unsigned char * data。我們先來看一下QT中的QImage對象。在加載data數據前&a…

開啟chrome默認支持ipv6

在快捷方式后面的屬性后面輸入 --enable-ipv6 以下為轉載&#xff1a; [轉載]chrome開啟或關閉IPV6方法 (2012-05-27 17:54:06) 轉載▼ 標簽&#xff1a; 轉載 分類&#xff1a; 技術 原文地址&#xff1a;chrome開啟或關閉IPV6方法作者&#xff1a;余鯤濤 chrome和firefox都是…

Nginx安裝部署

轉&#xff1a;http://www.cnblogs.com/zhuhongbao/archive/2013/06/04/3118061.html Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務器&#xff0c;也是一個 IMAP/POP3/SMTP 代理服務器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開…

android ble 連續讀寫,Android BLE實現對藍牙的讀寫

【實例簡介】通過修改官方的demo實現對藍牙的讀寫操作&#xff0c;詳細http://blog.csdn.net/chenfengdejuanlian/article/details/45787123【實例截圖】【核心代碼】BluetoothLe_demo0└── BluetoothLe_demo0├── AndroidManifest.xml├── bin│ ├── AndroidManife…

一分鐘經理人

原創2016-12-0858沈劍 零、緣起近期公司再做管理者培訓&#xff0c;偶老大推薦了一本薄薄的《一分鐘經理人》&#xff0c;斯賓塞.約翰遜&#xff0c;花了1小時讀完有感&#xff0c;沉淀一篇閱讀筆記&#xff0c;故有此文。一、前言常見經理人有兩類&#xff1a;&#xff08;1&a…

python寫機器人程序_用Python寫的一個多線程機器人聊天程序

本人是從事php開發的, 近來想通過php實現即時通訊(兼容windows)。后來發現實現起來特別麻煩&#xff0c; 就想到python。聽說這家伙在什么地方都能發揮作用。所以想用python來做通訊模塊。。。所以主要學習pythonn的多線程和tcp連接。但是沒有用過python&#xff0c; 所有在學習…

[轉] 前端中的MVC

MVC是一種設計模式&#xff0c;它將應用劃分為3個部分&#xff1a;數據&#xff08;模型&#xff09;、展現層&#xff08;視圖&#xff09;和用戶交互&#xff08;控制器&#xff09;。其中&#xff1a; M - MODEL&#xff08;模型&#xff09; V - VIEW&#xff08;視圖&…

ipoo3可以用鴻蒙,iqooneo3支持無線充電嗎_iqooneo3可以無線充電嗎

iqoo neo3在不高的價格上還保證了自己的品質&#xff0c;有很高的性能&#xff0c;很不錯的屏幕。那么這款手機可以支持無線充電嗎&#xff1f;小編為大家介紹關于iqoo neo3的充電方面。1.iqoo neo3可以支持無線充電嗎iQOO Neo3 配備了 44W 超級閃充&#xff0c;屬于小刀&#…

紅帽Linux故障定位技術詳解與實例(1)

紅帽Linux故障定位技術詳解與實例(1) 2011-09-28 14:26 圈兒 BEAREYES.COM 我要評論(0) 字號&#xff1a;T | T在線故障定位就是在故障發生時, 故障所處的操作系統環境仍然可以訪問&#xff0c;故障處理人員可通過console, ssh等方式登錄到操作系統上&#xff0c;在shell上執行…

u2020 華為_華為5G網管U2020常用MML命令(很實用)

激活小區ACT NRCELL:;ACT NRDUCELL:;去激活小區DEA NRCELL:;DEA NRDUCELL:;查詢小區靜態信息LST NRCELL:;LST NRDUCELL:;查詢小區動態信息DSP NRCELL:;DSP NRDUCELL:;修改幀偏置MOD GNODEBPARAM:FRAMEOFFSET70728;修改子幀配比、時隙結構MOD NRDUCELL:NRDUCELLID0,DUPLEXMODECE…

Struts2中過濾器,攔截器,監聽器他們之間有什么區別?

1、攔截器是基于java反射機制的&#xff0c;而過濾器是基于函數回調的。2、過濾器依賴與servlet容器&#xff0c;而攔截器不依賴與servlet容器。3、攔截器只能對Action請求起作用&#xff0c;而過濾器則可以對幾乎所有請求起作用。4、攔截器可以訪問Action上下文、值棧里的對象…

pdf在html中加載不出來,在網頁中打開顯示PDF

在這里呢&#xff0c;本站僅為大家講解在網頁中顯示PDF文件的簡單方法&#xff0c;注意&#xff0c;是簡單方法&#xff0c;同時&#xff0c;本站已驗證過如下的相關代碼&#xff0c;測試已通過。當然&#xff0c;有的朋友可能會問&#xff0c;是否能達到像百度文庫那樣在網頁中…

hikaril連接sql2000_hikari連接池解析(版本:HikariCP-2.5.1.jar)

maxLifetime參數maxLifetime參數必須小于數據庫的time_wait,默認是1800000&#xff0c;即30分鐘。如果設置為0&#xff0c;表示存活時間無限大。如果不等于0且小于30秒則會被重置回30分鐘。HikariConfig類中有該參數的校驗規則。HikariPool類中&#xff0c;當我們初始化連接池的…

app開發歷程————Android程序解析服務器端的JSON格式數據,顯示在界面上

上一篇文章寫的是服務器端利用Servlet 返回JSON字符串&#xff0c;本文主要是利用android客戶端訪問服務器端鏈接&#xff0c;解析JSON格式數據&#xff0c;放到相應的位置上。 首先&#xff0c;android程序的布局文件main.xml 1 <LinearLayout xmlns:android"http://s…