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