ASP.NET 容許在輸出緩存中緩存同一頁的多個版本。輸出緩存可能會因下列因素而異:web
能夠經過如下兩種方法來緩存頁輸出的多個版本:sql
使用 @ OutputCache 指令的屬性以聲明方式數據庫
使用 HttpCachePolicy 類的屬性和方法以編程方式。編程
@ OutputCache 指令包括四個可用來緩存頁輸出的多個版本的屬性:瀏覽器
注意:您必須在任何 @ OutputCache 指令中包括 VaryByParam 屬性或 VaryByControl屬性。可是,若是您不須要使緩存輸出因控制值或參數而異,則能夠定義值爲 None的 VaryByParam。
緩存
HttpCachePolicy 類提供兩個屬性和一個方法,您能夠經過它們以編程方式指定與以聲明方式所能設置的緩存配置相同的緩存配置。使用 VaryByParams 和 VaryByHeaders 屬性能夠分別指定查詢字符串參數和標頭名稱做爲緩存策略改變依據。使用 SetVaryByCustom 方法能夠定義要做爲輸出緩存改變依據的自定義字符串。 服務器
若是您的 Web 應用程序包含一個基於請求瀏覽器的類型建立不一樣輸出的頁,則能夠按請求該頁的瀏覽器的主版原本緩存頁輸出的版本。網絡
注意:主版本和瀏覽器類型信息是經過 HttpBrowserCapabilities 對象的 MajorVersion 屬性在當前請求中傳遞的。ide
基於瀏覽器類型以聲明方式緩存頁的多個版本:工具
下面的示例將致使持續緩存該頁達 10 秒。輸出將因瀏覽器類型而異。
<%@ OutputCache Duration="10" VaryByParam="None" VaryByCustom="browser" %>
基於瀏覽器類型以編程方式緩存頁的多個版本:
下面的代碼示例演示如何持續緩存頁的多個版本達 1 分鐘。輸出將因發出請求的瀏覽器的類型而異。
protected void Page_Load(object sender, EventArgs e) { Response.Cache.SetExpires(DateTime.Now.AddMinutes(1d)); Response.Cache.SetCacheability(HttpCacheability.Public); Response.Cache.SetValidUntilExpires(true); Response.Cache.SetVaryByCustom("browser"); }
有時候您但願緩存某頁,可是該頁可能基於查詢字符串參數的值或回發中與頁一塊兒發送的值生成不一樣的輸出
能夠根據做爲查詢字符串值或窗體發送值發送的參數緩存頁響應的多個版本。
注意 |
在用於緩存目的時,ASP.NET 將帶相同鍵/值對的查詢字符串值或窗體發送值視爲相同,不管參數傳遞的順序如何。然而,對於緩存目的,參數名是區分大小寫的,ASP.NET 將爲大寫和小寫的參數名和參數值緩存不一樣版本的頁。 |
下面的代碼示例將頁緩存 60 秒,並指定將要根據 City 查詢字符串值或窗體發送參數緩存頁輸出的不一樣版本。
<%@ OutputCache Duration="60" VaryByParam="City" %>
注意 |
若是要根據多個參數改變輸出緩存,請包括以分號 (;) 做爲分隔符的參數名稱的列表。若是要根據全部的參數值來改變緩存,請將 VaryByParam 屬性設置爲星號 (*)。下面的代碼示例演示如何經過 City 和 ZipCode 參數改變頁輸出。 |
使用參數以編程方式緩存頁輸出的多個版本
下面的代碼示例演示當具備不一樣的 Zip 參數值的請求到達服務器時,如何緩存頁的多個版本。
C#
Response.Cache.SetExpires(DateTime.Now.AddMinutes(1.0));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(true);
Response.Cache.VaryByParams["Zip"] = true;
注意 |
若是要根據多個參數改變緩存的內容,請屢次設置 VaryByParams 屬性。若是要根據全部標頭值改變緩存的內容,請將 VaryByHeader 屬性設置爲星號 (*)。下面的代碼示例演示如何經過 City 和 Zip 參數改變頁輸出。 |
如何:使用 HTTP 標頭對某頁的各個版本進行緩存
使用 ASP.NET,您能夠根據指定的 HTTP 標頭的值對某頁的多個版本進行緩存。當請求頁時,您能夠指定按傳遞到應用程序的單個標頭、多個標頭或全部標頭進行緩存。
根據 HTTP 標頭值以聲明方式對某頁的各個版本進行緩存
下面的示例將頁緩存 60 秒,並根據隨 Accept-Language HTTP 標頭傳遞的值設置要緩存的頁的版本:
<%@ OutputCache Duration="60" VaryByParam="None" aryByHeader="Accept-Language" %>
注意:若是要根據多個標頭改變緩存的內容,請以分號 (;) 做爲分隔符包括標頭名稱的列表。若是要根據全部標頭值改變緩存的內容,請將 VaryByHeader 屬性設置爲星號 (*)。
根據 HTTP 標頭值以編程方式對某頁的各個版本進行緩存
下面的代碼示例演示如何爲有不一樣的 Accept-Language HTTP 標頭值的請求,將某頁的多個版本緩存一分鐘之久。
protected void Page_Load(object sender, EventArgs e) { Response.Cache.SetExpires(DateTime.Now.AddMinutes(1d)); Response.Cache.SetCacheability(HttpCacheability.Public); Response.Cache.SetValidUntilExpires(true); Response.Cache.VaryByHeaders["Accept-Language"] = true; }
注意:若是要根據多個標頭改變緩存的內容,須要在 VaryByHeaders 屬性中設置多個值。若是要根據全部標頭改變緩存的內容,請將VaryByHeaders["VaryByUnspecifiedParameters"] 設置爲 true。
如何:使用自定義字符串對頁的各個版本進行緩存
除了按瀏覽器類型和參數進行不一樣的輸出緩存行爲外,還能夠根據您定義的方法所返回的不一樣字符串對頁輸出的多個版本進行緩存。
根據自定義字符串對頁進行緩存時,應首先指定要使用的自定義字符串的標識符。而後在應用程序的 Global.asax 文件中建立一個方法,該方法接受此標識符,而且返回一個值,做爲進行不一樣的輸出緩存行爲的依據。
根據自定義字符串對頁輸出的多個版本進行緩存
下面的指令根據自定義字符串「minorversion」改變頁輸出。
<%@ OutputCache Duration="10" VaryByParam="None" VaryByCustom="minorversion" %>
下面的代碼示例演示如何將自定義字符串設置爲「minorversion」。
C#
Response.Cache.SetVaryByCustom("minorversion");
注意 |
若是試圖以編程方式和聲明方式設置自定義字符串,則會收到InvalidOperationException。您須要選擇其中一種方法。 |
被重寫的方法接受您在 VaryByCustom 屬性或 SetVaryByCustom 方法中設置的字符串,做爲它的 arg 參數。例如,有些頁可能根據請求瀏覽器的次版本進行緩存。對於這些頁,能夠將 VaryByCustom 屬性設置爲「minorversion」。而後,在被重寫的GetVaryByCustomString 方法中,能夠檢查 arg 參數,並根據 arg 參數的值是否爲「minorversion」返回不一樣的字符串。
下面的代碼示例演示一個 Global.asax 文件,其中的 GetVaryByCustomString 方法被重寫。
<%@ Application language="C#" %> <script runat="server"> public override string GetVaryByCustomString(HttpContext context, string arg) { if(arg == "minorversion") { return "Version=" + context.Request.Browser.MinorVersion.ToString(); } return base.GetVaryByCustomString(context, arg); } </script>
執行此操做有兩個選項:控件緩存和緩存後替換。
在控件緩存(也稱爲片斷緩存)中,能夠經過建立用戶控件來包含緩存的內容,而後將用戶控件標記爲可緩存來緩存部分頁輸出。該選項容許緩存頁中的特定內容,而在每次都從新建立整個頁。例如,若是建立的頁顯示大量動態內容(如股票信息),但也有某些部分是靜態的(如每週摘要),則能夠在用戶控件中建立這些靜態部分並將用戶控件配置爲緩存。
緩存後替換與控件緩存正好相反。它對頁進行緩存,可是頁中的某些片斷是動態的,所以不會緩存這些片斷。例如,若是建立的頁在設定的時間段內徹底是靜態的(例如新聞報道頁),能夠設置爲緩存整個頁。若是爲緩存的頁添加旋轉廣告橫幅,則在頁請求之間,廣告橫幅不會變化。然而,使用緩存後替換,能夠對頁進行緩存,但能夠將特定部分標記爲不可緩存。在本例中,將廣告橫幅標記爲不可緩存。它們將在每次頁請求時動態建立,並添加到緩存的頁輸出中。
控件緩存
經過建立用戶控件來緩存內容,能夠將頁上須要花費寶貴的處理器時間來建立的某些部分(例如數據庫查詢)與頁的其餘部分分離開。只需佔用不多服務器資源的部分能夠在每次請求時動態生成。
在標識了要緩存的頁的部分,並建立了用以包含這些部分中的每一個部分的用戶控件後,您必須肯定這些用戶控件的緩存策略。您可使用 @ OutputCache 指令,或者在代碼中使用PartialCachingAttribute 類,以聲明的方式爲用戶控件設置這些策略。
例如,若是在用戶控件文件(.ascx 文件)的頂部包括下面的指令,則該控件的一個版本將在輸出緩存中存儲 120 秒。
<%@ OutputCache Duration="120" VaryByParam="None" %>
若要在代碼中設置緩存參數,能夠在用戶控件的類聲明中使用一個屬性。例如,若是在類聲明的元數據中包括下面的屬性,則該內容的一個版本將在輸出緩存中存儲 120 秒:
[PartialCaching(120)]
public partial class CachedControl : System.Web.UI.UserControl{ // Class Code}
注意:因爲可在頁上嵌套用戶控件,您還能夠嵌套已放置到輸出緩存中的用戶控件。能夠爲頁和嵌套的用戶控件指定不一樣的緩存設置。
以編程方式引用緩存的用戶控件
在以聲明的方式建立可緩存的用戶控件時,能夠包括一個 ID 屬性,以便以編程方式引用該用戶控件實例。可是,在代碼中引用用戶控件以前,必須驗證在輸出緩存中是否存在該用戶控件。緩存的用戶控件只在首次請求時動態生成;在指定的時間到期以前,從輸出緩存知足全部的後續請求。肯定用戶控件已實例化後,能夠從包含頁以編程方式操做該用戶控件。例如,若是經過聲明方式將 SampleUserControl 的 ID 分配給用戶控件,則可使用下面的代碼檢查它是否存在。
protected void Page_Load(object sender, EventArgs e)
{ if (SampleUserControl != null)// Place code manipulating SampleUserControl here.}
以不一樣的持續時間緩存頁和用戶控件
能夠爲頁和頁上的用戶控件設置不一樣的輸出緩存持續時間值。若是頁的輸出緩存持續時間長於用戶控件的輸出緩存持續時間,則頁的輸出緩存持續時間優先。例如,若是頁的輸出緩存設置爲 100 秒,而用戶控件的輸出緩存設置爲 50 秒,則包括用戶控件在內的整個頁將在輸出緩存中存儲 100 秒,而與用戶控件較短的時間設置無關。
下面的代碼示例演示了當頁的緩存持續時間長於用戶控件的緩存持續時間時的效果。該頁配置爲緩存 100 秒。
<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>
<SampleControl:Time runat="server" /><br /> <br /> <br />
This page was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString(); Response.Write(t); %>
下面的代碼示例演示了包括在頁中的用戶控件。控件的緩存持續時間設置爲 50 秒。
<% @Control language="C#" %>
<% @OutputCache duration="50" varybyparam="none" %>
This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
不過,若是頁的輸出緩存持續時間比用戶控件的輸出緩存持續時間短,則即便已爲某個請求從新生成該頁的其他部分,也將一直緩存用戶控件直到其持續時間到期爲止。例如,若是頁的輸出緩存設置爲 50 秒,而用戶控件的輸出緩存設置爲 100 秒,則頁的其他部分每到期兩次,用戶控件纔到期一次。
下面的代碼演示了一個頁的標記,該頁中包含的用戶控件的緩存持續時間長於該頁的緩存持續時間。該頁配置爲緩存 50 秒。
<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>
<SampleControl:Time runat="server" /><br /> <br /> <br />
This page was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>
下面的代碼演示了包括在頁中的用戶控件。控件的緩存持續時間設置爲 100 秒。
C#
<% @Control language="C#" %>
<% @OutputCache duration="100" varybyparam="none" %>
This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString(); Response.Write(t); %>
緩存用戶控件輸出的多個版本
就像能夠改變已進行輸出緩存的頁的版本同樣,您能夠輸出緩存具備用戶控件的頁的區域。
經過根據控件的名稱和 GET 查詢字符串或窗體 POST 參數值,或只根據參數值改變用戶控件輸出,您能夠完成該操做。 經過在它所包含的 .aspx 文件中對用戶控件進行屢次聲明,您也能夠緩存頁上用戶控件的多個版本。 您可使用這些技術中的任何一個,不管是在 .ascx 文件中使用 @ OutputCache 指令指定用戶控件的輸出緩存,仍是在代碼隱藏類中開發用戶控件時使用PartialCachingAttribute 特性。
用戶控件的 @ OutputCache 指令支持四種特性:VaryByParam、VaryByCustom、VaryByControl 和 Shared。 PartialCachingAttribute類包括四種屬性:VaryByParams、VaryByControls、VaryByCustom 和 Shared,使用這些屬性,您能夠經過向代碼隱藏類中的用戶控件添加特性使用相同技術。
當首次對包含具備輸出緩存設置的用戶控件的 ASP.NET 頁進行請求時,控件輸出的實例將保存到內存中。 默認狀況下,包含同一用戶控件的每一頁都將會在請求該頁時將控件輸出的另外一個實例添加到內存中。
例如,若是建立了一個具備輸出緩存設置的用戶控件 Sample.ascx,並將 Sample.ascx 添加到了應用程序的 25 個 ASP.NET 頁中,則輸出緩存中至少會存儲 25 個 Sample.ascx 版本。 另外,若是使用 VaryByControl、VaryByCustom 或 VaryByParam 特性修改用戶控件的緩存行爲,則緩存中將會有更多的用戶控件輸出版本。 例如,假定您將 TextBox Web 服務器控件包含在用戶控件中,並將其 ID 屬性設置爲 MyTextBox。 若是將 VaryByControl 特性設置爲MyTextBox,則對於 MyTextBox 控件接收到的每一個值,都將會有一個用戶控件輸出版本存儲在緩存中。
若是在同一應用程序的多個頁中使用了相同的用戶控件,則能夠經過如下方法來節省內存:將用戶控件的 @ OutputCache 指令的 Shared 特性設置爲 true,或將控件的PartialCachingAttribute 特性的 Shared 屬性設置爲 true。 這意味着每一個頁都將訪問用戶控件輸出的同一實例。 對於常用和頻繁緩存的用戶控件,使用 Shared 屬性能夠節省大量的內存。
將用戶控件輸出添加到輸出緩存中和對頁輸出進行相同的操做這二者存在一個主要區別。 儘管二者的輸出緩存都支持使用 GET 查詢字符串和窗體 POST 參數建立和緩存輸出的多個版本,但用戶控件不支持基於 HTTP 標頭的緩存。
您可使用如下四種技術來改變輸出緩存的用戶控件:
如何:根據參數緩存用戶控件的多個版本
注意:僅當用戶控件回發並自行處理回發時,根據查詢字符串或窗體 POST 參數將用戶控件輸出改變到緩存纔有效。 若是用戶控件回發到包含頁,則該類型的用戶控件輸出緩存將不能正常工做。
經過使用 VaryByControl 特性以聲明方式緩存用戶控件的多個版本
注意 |
若是在指令中使用 VaryByControl 特性,則不須要同時包括 VaryByParam 特性,雖然您也能夠包括後者並將其設置爲「None」。 |
例如,下面的 @ OutputCache 指令將用戶控件的過時時間設置爲 60 秒,並經過 ID 爲 State 的 ASP.NET 服務器控件來改變控件輸出:
<%@ OutputCache Duration="60" VaryByControl="State" %>
經過使用 VaryByControls 屬性以編程方式緩存用戶控件的多個版本
下面的代碼示例將 Duration 設置爲 60 秒並將 VaryByControls 設置爲 State。 該代碼應包括在擴展 UserControl 類的代碼以前。
[PartialCaching(60, null, State, null)]
經過使用 VaryByParam 特性以聲明方式緩存用戶控件的多個版本
注意 |
若是將 VaryByControl 特性包括在用戶控件的 @ OutputCache 指令中,則不須要同時包括 VaryByParam 特性。 |
例如,下面的 @ OutputCache 指令將用戶控件的過時時間設置爲 60 秒,並經過名爲 State 的窗體 POST 參數或查詢字符串參數的值來改變控件的輸出。
<%@ OutputCache Duration="60" VaryByParam="State" %>
經過使用 VaryByParams 屬性以編程方式緩存用戶控件的多個版本
下面的代碼示例將 Duration 設置爲 60 秒,並將 VaryByParams 設置爲名爲 State 的窗體 POST 參數或查詢字符串參數。 該代碼應包括在擴展 UserControl 類的代碼以前。
[PartialCaching(60, State, null, null)]
如何:使用聲明性的特性緩存用戶控件的多個版本
只需在 .aspx 文件中屢次聲明某個用戶控件即可以緩存該用戶控件的多個版本。 同未進行緩存的用戶控件同樣,能夠根據應用程序的須要將一個緩存的用戶控件屢次包含在 ASP.NET 頁中。 除非將用戶控件的 Shared 屬性設置爲 true,不然控件輸出的多個版本都將存儲在緩存中。
經過使用聲明性的特性緩存用戶控件的多個版本
下面的 @ OutputCache 聲明將對控件進行 120 秒鐘的緩存:
<%@ OutputCache Duration="120" VaryByParam="None" %>
只需在 .ascx 文件中包含持續時間值有效的 @ OutputCache 指令或在代碼隱藏類中設置 PartialCachingAttribute,便可得到用戶控件的不一樣緩衝輸出。
動態更新緩存頁的部分
對頁面進行緩存能夠大大提升 Web 應用程序的性能。 不過,在有些狀況下,須要緩存頁面的大部份內容,但頁面中的某些片斷是動態的。 例如,若是建立一個頁面,其中的新聞故事在設定時間段內徹底是靜態的,則能夠設置爲緩存整個頁面。 若是但願提供在每次頁請求時都發生變化的交替出現的廣告橫幅,則該頁中包含該廣告的部分須要是動態的。
若要容許緩存某個頁面但動態地替換其中的某些內容,可使用 ASP.NET 緩存後替換。 經過使用緩存後替換,將對整個頁面進行輸出緩存,並將特定的部分標記爲不進行緩存。 在廣告橫幅示例中,AdRotator 控件使您能夠利用緩存後替換功能,以便爲每一個用戶及在每次刷新頁時動態建立廣告。
有三種方法能夠實現緩存後替換:
Substitution 控件
ASP.NET Substitution 控件指定緩存頁中動態建立而不進行緩存的部分。 將 Substitution 控件放置在該頁上要顯示動態內容的位置。
在運行時,Substitution 控件調用使用 MethodName 屬性指定的方法。 該方法必須返回一個字符串,而後該字符串替換Substitution 控件的內容。 該方法必須是 Page 或 UserControl 包含控件上的靜態方法。
使用 Substitution 控件能夠將客戶端可緩存性更改成服務器可緩存性,以便該頁面不會在客戶端上進行緩存。 這樣能夠確保之後對該頁的請求可以再次調用該方法以生成動態內容。
Substitution API
若要以編程方式爲緩存頁建立動態內容,能夠在頁代碼中將某個方法的名稱做爲參數傳遞給 WriteSubstitution 方法來調用該方法。 該方法處理動態內容的建立,它採用單個 HttpContext 參數並返回一個字符串。 該返回字符串是將在給定位置被替換的內容。 經過調用 WriteSubstitution 方法來代替以聲明方式使用 Substitution 控件的一個好處是能夠調用任意對象的方法,而不僅是調用 Page 或 UserControl 對象的靜態方法。
調用 WriteSubstitution 方法能夠將客戶端可緩存性更改成服務器可緩存性,以便該頁不會在客戶端上進行緩存。 這樣能夠確保之後對該頁的請求可以再次調用該方法以生成動態內容。
AdRotator 控件
AdRotator 服務器控件在內部實現對緩存後替換的支持。 若是將 AdRotator 控件放在頁面上,則不管是否緩存父頁,都將在每次請求時呈現其特有的廣告。 所以,包含 AdRotator 控件的頁面只在服務器端進行緩存。
#begin //網上查找
//這種方式是使用的substitution控件的基本方法
<asp:Substitution ID="Substitution1" runat="server" MethodName="GetCurrentDateTime" />
//下面這種方式是調用substitution的API的方式(substitution的API包括一個關鍵的WriteSubstitution方法,該方法來自於HttpResponse類 <% Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetCurrentDateTime)); %>//,其語法代碼以下所示:)
public void WriteSubstitution(HttpResponseSubstitutionCallback callback) { }
//這個委託定義的方法有兩個特徵:1:返回值必須是string;2:參數有且僅有一個,而且是HttpContext類型
public delegate string HttpResponseSubstitutionCallback (HttpContext context)
#end
使用 SqlCacheDependency 類在 ASP.NET 中緩存
ASP.NET 容許您使用 SqlCacheDependency 類建立依賴於數據庫中表或行的緩存項。 當表中或特定行中發生更改時,帶有依賴項的項便會失效,並會從緩存中移除。 能夠在 Microsoft SQL Server 7.0、SQL Server 2000 和 SQL Server 2005 中設置表的依賴項。 若是您使用 SQL Server 2005,還能夠設置特定記錄的依賴項。
在某些方案中,使用帶有 SQL 依賴項的緩存可顯著提升應用程序的性能。 例如,假定您正在構建一個從數據庫顯示產品信息的電子商務應用程序。 若是不進行緩存,則每當用戶要查看產品時,應用程序都必須從數據庫請求數據。 您能夠在某一時刻將產品信息緩存一天,因爲產品信息已經在內存中,所以可確保較快的響應時間, 可是,當產品信息發生變化時,緩存的產品信息就會失去與數據庫中數據的同步,且不一樣步的時間最長可達一天。
使用 SQL 緩存依賴項能夠緩存產品信息,並建立一個數據庫表或行更改的依賴項。 當且僅當數據更改時,基於該數據的緩存項便會失效並會從緩存中移除。 下次從緩存中請求該項時,若是該項不在緩存中,即可以再次向緩存中添加更新後的版本,而且可確保具備最新的數據。
SQL 緩存依賴項還可用於頁輸出緩存。 例如,能夠建立一個名爲 ViewProduct.aspx 的頁,用於顯示有關特定產品的信息。 能夠將該頁的緩存策略設置爲 SQL 依賴項,就如爲手動添加到緩存中的項所設置的依賴項同樣。 該頁便會一直存儲在緩存中,直至所依賴的表或行發生更改成止。 當數據發生更改時,便會從新建立頁,並將新建立的頁再次存儲在輸出緩存中。
ASP.NET SQL 緩存依賴項提供如下功能:
SQL Server 7.0 和 SQL Server 2000 實現
ASP.NET 爲 SQL Server 7.0 和 SQL Server 2000 的緩存依賴項實現了一個輪詢模型。 ASP.NET 進程內的一個線程會以指定的時間間隔輪詢 SQL Server 數據庫,以肯定數據是否已更改。 若是數據已更改,緩存依賴項便會失效,並從緩存中移除。 能夠在 Web.config 文件中以聲明方式指定應用程序中的輪詢間隔,也可使用 SqlCacheDependency 類以編程方式指定此間隔。
對於 SQL Server 7.0 和 SQL Server 2000,SQL 緩存依賴項僅限於表級別的數據更改。 能夠將 ASP.NET 配置爲輪詢數據庫來肯定表中的更改,但不能肯定特定行中的更改。
啓用 SQL 緩存
爲了在 SQL Server 7.0 和 SQL Server 2000 中使用 SQL 緩存依賴項,必須先將 SQL Server 配置爲支持緩存依賴項。 ASP.NET 提供了一些實用工具,可用於配置 SQL Server 上的 SQL 緩存,其中包括一個名爲 Aspnet_regsql.exe 的工具和SqlCacheDependencyAdmin 類。 有關如何在 SQL Server 上啓用 SQL 緩存依賴項的更多信息,請參見如何:使用緩存鍵依賴項緩存頁輸出。
SQL Server 2005 實現
SQL Server 2005 爲緩存依賴項實現的模型不一樣於 SQL Server 7.0 和 SQL Server 2000 中的緩存依賴項模型。 在 SQL Server 2005 中,不須要執行任何特殊的配置步驟來啓用 SQL 緩存依賴項。 此外,SQL Server 2005 還實現了一種更改通知模型,能夠向訂閱了通知的應用程序服務器發送通知,而不是依賴早期版本的 SQL Server 中必需的輪詢模型。
SQL Server 2005 緩存依賴項在接收通知的更改類型方面更具靈活性。 SQL Server 2005 監控對特定 SQL 命令的結果集的更改。若是數據庫中發生了將修改該命令的結果集的更改,依賴項便會使緩存的項失效。 此功能使得 SQL Server 2005 能夠提供行級別的通知。
對用於測試更改的查詢有一些要求。 必須提供徹底限定的表名,其中包括全部者名稱(例如 dbo.authors)。 總之,SQL 2005 通知支持 Select 查詢和存儲過程,支持多個查詢和嵌套查詢,但不支持聚合操做(例如 COUNT(*))。 有關 SQL Server 2005 支持哪些查詢以及通知規則的更多信息,請參見「SQL Books Online」(SQL 聯機叢書)中的主題「Creating a Query for Notification」(建立通知查詢)。
在 ASP.NET 應用程序中配置 SQL 緩存
在對 SQL Server 7.0 或 SQL Server 2000 進行了緩存依賴項配置後,或是在 SQL Server 2005 中建立了適當的命令依賴項後,就能夠配置您的應用程序來使用 SQL 緩存依賴項,如同配置任何其餘緩存依賴項同樣。 例如,能夠在 Web.config 文件中建立一個緩存配置文件,而後在應使用 SQL 緩存依賴項的每一個頁中引用該緩存配置文件。