緩存是指系統(tǒng)或應(yīng)用程序?qū)㈩l繁使用的數(shù)據(jù)保存到內(nèi)存中,當(dāng)系統(tǒng)或應(yīng)用程序再次使用時(shí),能構(gòu)快速的獲取數(shù)據(jù)。
它的弊端在于顯示的內(nèi)容可能不是最新,最精確的
ASP.Net 緩存主要分為兩大類: 網(wǎng)頁輸出緩存和應(yīng)用程序緩存
網(wǎng)頁輸出緩存針對(duì)ASP.NET Pages 頁面中的HTML進(jìn)行緩存,是可視化內(nèi)容對(duì)象,如圖片,GridView表格控件,用戶控件等
應(yīng)用程序緩存是針對(duì)應(yīng)用程序內(nèi)的數(shù)據(jù)緩存,如:將DataSet等數(shù)據(jù)存儲(chǔ)到緩存
網(wǎng)頁輸出緩存:(ASP 2.0 框架以后所形成功能)
【注:頁輸出緩存可以分別為每個(gè)頁配置緩存頁緩存,也可以在Web.config文件中創(chuàng)建緩存配置文件】
完整頁面緩存
完整頁面緩存是指將已生成的動(dòng)/靜頁面全部?jī)?nèi)容保存在服務(wù)器中
設(shè)置頁的緩存可以使用一下兩種方式:
【1】:使用<%@OutputCache…%>指令聲明(高級(jí))
要對(duì)一個(gè)網(wǎng)頁P(yáng)age假如60s 完整網(wǎng)頁緩存可以在.aspx 網(wǎng)頁中加入 一段指令聲明。如下:
1 | <%@ OutputCache Duration="60" VaryByParam="none" %> |
緩存展現(xiàn)示例:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%--設(shè)置整頁緩存--%> <%@ OutputCache Duration="10" 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>完整網(wǎng)頁緩存</title> <script runat="server"> public void Page_Load(object sender, EventArgs e) { Response.Write("頁面緩存設(shè)置示例:<br>設(shè)置緩存時(shí)間為十秒<br>當(dāng)前時(shí)間:"+DateTime.Now.ToString()); } //由于緩存是不可視的 所以做在這里用一種形式展現(xiàn)出來 </script> </head> <body> <form id="form1" runat="server"> <div> </div> </form> </body> </html> |
1 | 【2】使用Response.Cache 的頁面輸出緩存API(低級(jí)) |
1 | 以程序化API方式。要在后臺(tái)代碼中設(shè)置60s的網(wǎng)頁緩存,示例代碼如下: |
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); |
緩存展現(xiàn)示例:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%--使用參數(shù)緩存網(wǎng)頁--%> <%@ OutputCache Duration="10" VaryByParam="Test" %> <!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>完整網(wǎng)頁緩存</title> <script runat="server"> void Page_Load(object sender, EventArgs e) { //設(shè)置緩存數(shù)據(jù)存儲(chǔ)到服務(wù)器上 Response.Cache.SetCacheability(HttpCacheability.Server); string str = Request.QueryString["Test"]; if (str == null) { Response.Cache.SetNoServerCaching(); Response.Write("沒有設(shè)置緩存的時(shí)間為:" + DateTime.Now.ToString()); } else { Response.Write("設(shè)置緩存的時(shí)間為:" + DateTime.Now.ToString()); } } //由于緩存是不可視的 所以做在這里用一種形式展現(xiàn)出來 </script> </head> <body> <form id="form1" runat="server"> <div> <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Default.aspx?Test=test" Text="緩存"></asp:HyperLink> </div> </form> </body> </html> API 所運(yùn)用的類型是HttpCachePolicy
HttpCachePolicy類方法如下:
方法 | 說明 |
SetAllowResponseInBrowserHistory | 當(dāng)allow參數(shù)為true時(shí),將使響應(yīng)在客戶端瀏覽器“歷史記錄”緩存中可用,而不論服務(wù)器上所做的HttpCacheability設(shè)置是什么 |
SetCacheability | 設(shè)置Cache-Control HTTP 標(biāo)頭。Cache-Control HTTP標(biāo)頭控制在網(wǎng)路上緩存文檔的格式 |
SetExpires | 該方法用于設(shè)置緩存過期的絕對(duì)時(shí)間 |
SetLastModified | 用于設(shè)置網(wǎng)頁的Last-Modified HTTP標(biāo)頭。Last-Modified HTTP標(biāo)頭表示頁面上次修改時(shí)間,緩存將依靠它來進(jìn)行 |
SetMaxAge | 基于指定的時(shí)間跨度設(shè)置Cache-Control:max-age HTTP標(biāo)頭 |
SetNoServerCaching | 停止當(dāng)前響應(yīng)的所有源服務(wù)器緩存 |
SetOmitVaryStar | 指定再按參數(shù)進(jìn)行區(qū)分時(shí) ,響應(yīng)是否應(yīng)該包含ary:*標(biāo)頭 |
SetSlidingExpiration | 將緩存過期從絕對(duì)事件設(shè)置為可調(diào)時(shí)間 |
SetVaryByCuston | 指定一個(gè)自定義文本字符串,以此區(qū)別緩存的輸出相應(yīng) |
頁面部分緩存 :
頁面部分緩存可采用兩種工作方式: 控件緩存和緩存后替換
控件緩存:
控件緩存有兩種設(shè)置方式
【1】使用OutputCache指令
控件緩存的OutputCache指令設(shè)置在用戶控件.ascx文件中,聲明代碼如下
<%@ OutputCache Duration="60" VaryByParam="none" %>
緩存展現(xiàn)示例:
1 .新建一個(gè)網(wǎng)站在默認(rèn)主頁Default.aspx 中添加一個(gè)label控件并在HTML中添加每秒刷新的聲明,通過每秒的更新來觀察用戶控件
的部分網(wǎng)頁緩存代碼如下:
<meta http-equiv="refresh" content="1; url= default.aspx" />
2.在Default.aspx.cs文件中編寫代碼如下:
protected void Page_Load(object sender, EventArgs e) { Label1.Text = "Web頁面 當(dāng)前系統(tǒng)時(shí)間:" + DateTime.Now.ToString(); }
3 .在解決方案管理器上,右鍵單擊項(xiàng)目名稱,在彈出的快捷菜單中選擇“添加新項(xiàng)”項(xiàng),在打開的窗口中選擇“web用戶控件”
添加個(gè)用戶控件。在.ascx 文件中添加Label控件,添加@OutputCache指令設(shè)置緩存代碼如下:
<%@ OutputCache Duration="10" VaryByParam="none" %>
在.ascx.cs文件中編寫與第二步同樣的代碼。
4.將Default.aspx切換到設(shè)計(jì)視圖 從解決方案管理器中將定義的用戶控件拖入到設(shè)計(jì)中。
【2】在代碼隱藏文件中使用PartailCachingAttibute類
PartailCachingAttibute屬性類標(biāo)記用戶控件(.ascx文件)
如以下示例代碼是在用戶控件的.ascx.cs 后臺(tái)代碼的開頭加入緩存屬性說明,主要用來設(shè)置用戶空件的緩存時(shí)間為10s
……引入的命名空間
[PartialCaching(10)] public partial class WebUserControl : System.Web.UI.UserControl {…}
緩存后替換:緩存后替換是Cache2.0新增的功能它和控件緩存剛好相反實(shí)現(xiàn)緩存后替換的方式有3種
<1>使用Substitution控件,以聲明的方式來實(shí)現(xiàn);
<2>使用Substitution控件,以程序化API方式來實(shí)現(xiàn);
<3>使用AdRotator控件,以AdRotator控件隱式實(shí)現(xiàn)。
緩存展現(xiàn)示例:.aspx 文件
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ OutputCache Duration="10" 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> <meta http-equiv="refresh" content="1; url= default.aspx" /> </head> <body> <form id="form1" runat="server"> <div> <asp:Substitution ID="Substitution1" runat="server" MethodName="GetNowTime" /> </div> <div> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> </div> </form> </body> </html> .aspx.cs 文件
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Label1.Text = "頁面被緩存,此時(shí)間10秒內(nèi)不會(huì)發(fā)生變化:" + DateTime.Now.ToString(); } //處理緩存后替換的方法GetNowTime() 此處必須是靜態(tài)的方法 public static string GetNowTime(HttpContext ctxt) { return "Substitution控件中的數(shù)據(jù)是動(dòng)態(tài)變化的:" + DateTime.Now.ToString(); } }
應(yīng)用程序數(shù)據(jù)緩存 :
應(yīng)用程序數(shù)據(jù)緩存(即頁面數(shù)據(jù)緩存)該緩存機(jī)制類似于Session ,優(yōu)點(diǎn)是由ASP.NET 管理緩存會(huì)在項(xiàng)過期,無效或者內(nèi)存不足時(shí)移出緩存項(xiàng)
注:這里所說僅僅是入門。