|
|
|
|
|
對(duì)于asp.net編寫的網(wǎng)頁(yè)來說,使用緩存是一種非常重要也是很常用的優(yōu)化技術(shù),它可以大大減輕服務(wù)器的負(fù)載壓力,優(yōu)化這些網(wǎng)頁(yè)的性能,在網(wǎng)與使用 .NET Framework 的任何其他功能相比,適當(dāng)?shù)厥褂镁彺婵梢愿玫靥岣哒军c(diǎn)的性能。同時(shí),在網(wǎng)頁(yè)加速顯示上也起了很大的作用。
OutputCache
以聲明的方式控制 ASP.NET 頁(yè)或頁(yè)中包含的用戶控件的輸出緩存策略。
語(yǔ)法:
<%@ OutputCache Duration="#ofseconds"
Location="Any | Client | Downstream | Server | None | ServerAndClient "
Shared="True | False"
VaryByControl="controlname"
VaryByCustom="browser | customstring"
VaryByHeader="headers"
VaryByParam="parametername"
VaryByContentEncoding="encodings"
CacheProfile="cache profile name | ''"
NoStore="true | false"
SqlDependency="database/table name pair | CommandNotification"
ProviderName="Provider Name"
%>
參數(shù)解釋:
參數(shù) | 說明 | 備注 |
Duration | 頁(yè)或用戶控件進(jìn)行緩存的時(shí)間(以秒計(jì))。 在頁(yè)或用戶控件上設(shè)置該特性為來自對(duì)象的 HTTP 響應(yīng)建立了一個(gè)過期策略,并將自動(dòng)緩存頁(yè)或用戶控件輸出。 | 此特性必選。 如果未包含該屬性,將出現(xiàn)分析器錯(cuò)誤。 除非你的Location=None,可以不添加此屬性,其余時(shí)候都是必須的。 |
Location | OutputCacheLocation 枚舉值之一。 默認(rèn)值為 Any。 | 包含在用戶控件(.ascx 文件)中的 @ OutputCache 指令不支持此特性。 |
CacheProfile | 與該頁(yè)關(guān)聯(lián)的緩存設(shè)置的名稱。 這是可選特性,默認(rèn)值為空字符串 ("")。 | 包含在用戶控件(.ascx 文件)中的 @ OutputCache 指令不支持此特性。 在頁(yè)中指定此屬性時(shí),屬性值必須與 outputCacheSettings 節(jié)下面的 outputCacheProfiles 元素中的一個(gè)可用項(xiàng)的名稱匹配。 如果此名稱與配置文件項(xiàng)不匹配,將引發(fā)異常。 |
NoStore | 一個(gè)布爾值,它決定了是否阻止敏感信息的二級(jí)存儲(chǔ)。 | 包含在用戶控件(.ascx 文件)中的 @ OutputCache 指令不支持此特性。 將此特性設(shè)置為 true 等效于在請(qǐng)求期間執(zhí)行以下代碼: Response.Cache.SetNoStore(); |
ProviderName | 一個(gè)字符串值,標(biāo)識(shí)要使用的自定義輸出緩存提供程序。 | 此屬性僅在用戶控件(.ascx 文件)中受到支持。 它不受包含在 ASP.NET 頁(yè)(.aspx 文件)中的 @ OutputCache 指令的支持。 |
Shared | 一個(gè)布爾值,確定用戶控件輸出是否可以由多個(gè)頁(yè)共享。 默認(rèn)值為 false。 | 包含在 ASP.NET 頁(yè)(.aspx 文件)中的 @ OutputCache 指令不支持此特性。 |
SqlDependency | 標(biāo)識(shí)一組數(shù)據(jù)庫(kù)/表名稱對(duì)的字符串值,頁(yè)或控件的輸出緩存依賴于這些名稱對(duì)。 請(qǐng)注意,SqlCacheDependency 類監(jiān)視輸出緩存所依賴的數(shù)據(jù)庫(kù)中的表,因此當(dāng)更新表中的項(xiàng)時(shí),使用基于表的輪詢時(shí)將從緩存中移除這些項(xiàng)。 如果以值 CommandNotification 使用通知(在 Microsoft SQL Server 2005 中),則最終會(huì)使用 SqlDependency 類向 SQL Server 2005 服務(wù)器注冊(cè)查詢通知。 | SqlDependency 特性的 CommandNotification 值僅在網(wǎng)頁(yè) (.aspx) 中有效。 用戶控件只能將基于表的輪詢用于 @ OutputCache 指令。 |
VaryByCustom | 任何表示自定義輸出緩存要求的文本。 如果特性的賦值為 browser,緩存將隨瀏覽器名稱和主要版本信息的不同而異。 如果輸入自定義字符串,則必須在應(yīng)用程序的 Global.asax 文件中重寫 GetVaryByCustomString 方法。 | |
VaryByHeader | 分號(hào)分隔的 HTTP 標(biāo)頭列表,用于使輸出緩存發(fā)生變化。 將該特性設(shè)為多標(biāo)頭時(shí),對(duì)于每個(gè)指定標(biāo)頭組合,輸出緩存都包含一個(gè)不同版本的請(qǐng)求文檔。 | 設(shè)置 VaryByHeader 特性將啟用在所有 HTTP 1.1 版緩存中緩存項(xiàng),而不僅僅在 ASP.NET 緩存中進(jìn)行緩存。 用戶控件中的 @ OutputCache 指令不支持此特性。 |
VaryByParam | 分號(hào)分隔的字符串列表,用于使輸出緩存發(fā)生變化。 默認(rèn)情況下,這些字符串對(duì)應(yīng)于使用 GET 方法特性發(fā)送的查詢字符串值,或者使用 POST 方法發(fā)送的參數(shù)。 將該特性設(shè)置為多個(gè)參數(shù)時(shí),對(duì)于每個(gè)指定參數(shù)組合,輸出緩存都包含一個(gè)不同版本的請(qǐng)求文檔。 可能的值包括 none、星號(hào) (*) 以及任何有效的查詢字符串或 POST 參數(shù)名稱。 | 在 ASP.NET 頁(yè)和用戶控件上使用 @ OutputCache 指令時(shí),需要此特性或 VaryByControl 特性。 如果沒有包含它,則發(fā)生分析器錯(cuò)誤。 如果不希望通過指定參數(shù)來改變緩存內(nèi)容,請(qǐng)將值設(shè)置為 none。 如果希望通過所有的參數(shù)值改變輸出緩存,請(qǐng)將特性設(shè)置為星號(hào) (*))。 |
VaryByControl | 分號(hào)分隔的字符串列表,用于改變用戶控件的輸出緩存。 這些字符串代表用戶控件中聲明的 ASP.NET 服務(wù)器控件的 ID 屬性值。 | 在 ASP.NET 頁(yè)和用戶控件上使用 @ OutputCache 指令時(shí),需要此特性或 VaryByParam 特性。 例如下面:根據(jù)頁(yè)面上下拉列表控件的選擇的值不同進(jìn)行不同的緩存輸出 <%@ OutputCache Duration="100" VaryByControl="dropTest"%> |
VaryByContentEncodings | 以分號(hào)分隔的字符串列表,用于更改輸出緩存。 將 VaryByContentEncodings 特性用于 Accept-Encoding 標(biāo)頭,可確定不同內(nèi)容編碼獲得緩存響應(yīng)的方式。 |
OutputCache示例:
下面的代碼示例演示如何設(shè)置頁(yè)或用戶控件進(jìn)行輸出緩存的持續(xù)時(shí)間。
<%@ OutputCache Duration="100" VaryByParam="none" %>
下一個(gè)代碼示例演示如何指示輸出緩存按頁(yè)或用戶控件的位置對(duì)它們進(jìn)行緩存,并根據(jù)窗體的 POST 方法或查詢字符串對(duì)窗體參數(shù)進(jìn)行計(jì)數(shù)。每個(gè)收到的具有不同位置或計(jì)數(shù)參數(shù)(或兩者)的 HTTP 請(qǐng)求都進(jìn)行 10 秒的緩存處理。帶有相同參數(shù)值的任何后繼請(qǐng)求都將從緩存中得到滿足,直至超過輸入的緩存期。
<%@ OutputCache Duration="10" VaryByParam="location;count" %>
應(yīng)用實(shí)例:
▲圖1 停止緩存的效果圖
▲圖2 執(zhí)行緩存的效果圖
如圖1所示,應(yīng)用程序初始顯示的是停止執(zhí)行緩存的時(shí)間。當(dāng)用戶刷新頁(yè)面時(shí),時(shí)間值將隨時(shí)變化,以便顯示當(dāng)前的最新時(shí)間。
如圖2所示,單擊“緩存時(shí)間”超鏈接后,頁(yè)面重定向到另一個(gè)頁(yè)面。這時(shí),頁(yè)面顯示的時(shí)間被緩存,數(shù)據(jù)過期時(shí)間為5秒。如果不斷地刷新該頁(yè),那么每隔5秒鐘時(shí)間值才變化一次。
本節(jié)示例存在兩個(gè)關(guān)鍵點(diǎn)。一是在運(yùn)行時(shí)實(shí)現(xiàn)停止緩存,二是配置@OutputCache指令。這兩點(diǎn)都已經(jīng)在應(yīng)用程序Default.aspx文件中予以實(shí)現(xiàn),下面列舉了該文件源代碼。
Default.aspx文件源代碼:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %>
<%@ OutputCache Duration="5" VaryByParam="location" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<script language="C# " runat="server">
void Page_Load(object sender, EventArgs e)
{ //設(shè)置僅將緩存數(shù)據(jù)存儲(chǔ)在服務(wù)器上
Response.Cache.SetCacheability(HttpCacheability.Server);
string temp_location = Request.QueryString["location"];
//如果location為空,則不緩存,否則根據(jù)@ OutputCache指令聲明執(zhí)行緩存
if (temp_location == null) {
//停止當(dāng)前響應(yīng)的所有服務(wù)器緩存
Response.Cache.SetNoServerCaching();
Label1.Text = "停止緩存的時(shí)間:" + DateTime.Now.ToString();
}
else
{
Label1.Text = "設(shè)置了緩存的時(shí)間:" + DateTime.Now.ToString();
}
}
</script>
<head id="Head1" runat="server">
<title>示例12-1</title>
<link id="InstanceStyle" href="StyleSheet.css" type="text/css" rel="stylesheet" />
</head>
<body>
<form id="form1" runat="server">
<div>
<fieldset style="width: 240px">
<legend class="mainTitle">設(shè)置頁(yè)面輸出緩存</legend><br />
<center><asp:Label ID="Label1" runat="server" CssClass="commonText"></asp:Label></center><br />
<a href="Default.aspx?location=beijing" class="littleMainTitle" >緩存時(shí)間</a><br />
</fieldset>
</div>
</form>
</body>
</html>
如上代碼所示,代碼頭部的@OutputCache指令設(shè)置了Duration和VaryByParam屬性,其指示數(shù)據(jù)過期時(shí)間為5秒。同時(shí),緩存根據(jù)參數(shù)location發(fā)生變化。另外,代碼還實(shí)現(xiàn)了Page_Load事件處理程序。在該程序中,首先,使用SetCacheability方法設(shè)置數(shù)據(jù)緩存必須存儲(chǔ)在服務(wù)器上,然后,獲取QueryString的location參數(shù)值,最后,根據(jù)location參數(shù)值進(jìn)行判斷。如果location參數(shù)值為空,則調(diào)用SetNoServerCaching方法停止當(dāng)前響應(yīng)的所有服務(wù)器緩存,并顯示當(dāng)前時(shí)間值。雖然@ OutputCache指令配置了頁(yè)面輸出緩存,但是,不會(huì)執(zhí)行頁(yè)面輸出緩存功能。如果location參數(shù)值不為空,則直接顯示當(dāng)前時(shí)間值。在這種情況下,將執(zhí)行@ OutputCache指令的配置內(nèi)容。
< %@ OutputCache NoStore="True" Duration="15" Location="Any" VaryByControl="OC" VaryByCustom="browser" VaryByHeader="headers" VaryByParam="none" %>
使用OutputCache注意事項(xiàng)
在使用 ASP.NET 緩存時(shí),應(yīng)注意以下事項(xiàng)。首先,不要緩存太多項(xiàng)。緩存每個(gè)項(xiàng)都有內(nèi)存開銷。不要緩存容易重新計(jì)算和很少使用的項(xiàng)。其次,給緩存項(xiàng)分配的有效期不要太短。很快到期的項(xiàng)會(huì)導(dǎo)致緩存中不必要的周轉(zhuǎn),并且會(huì)導(dǎo)致額外的代碼清除和垃圾回收工作。使用與“ASP.NET Applications”性能對(duì)象關(guān)聯(lián)的“Cache Total Turnover Rate”(緩存總流通率)性能計(jì)數(shù)器,您可以監(jiān)視緩存中由于項(xiàng)到期而導(dǎo)致的周轉(zhuǎn)。高周轉(zhuǎn)率可能說明存在問題,特別是當(dāng)項(xiàng)在到期前被移除時(shí)。(這種情況有時(shí)稱作內(nèi)存壓力。)
可以考慮把靜態(tài)的、變化不大的或者不經(jīng)常變化需要?jiǎng)討B(tài)加載的內(nèi)容放入控件中,使用緩存技術(shù)。