最近因項目要求,需要研究asp.net緩存,可是查閱了書本,msdn,網上後有點失望,真是天下文章一大抄啊,大家
講來講去都是那麼幾點,沒有條理,沒有重點,也沒有心得,所以我決定自己來寫一篇,當然,我是沒有能力來改變
這一現象的,只是寫來自己備忘罷了。
首先有幾點要說明:
1.個人認爲緩存只有兩種:頁輸出緩存與應用程序數據緩存。一般大家也是這麼認爲的,但是有另外一部份人卻把
這兩個部份分了又分,搞出三五種出來。這就讓人感覺很多餘了。
2.所謂控件緩存,其實是用戶控件緩存。可能是我理解有問題,我一開始還以爲那種html控件,web控件也可以進行
緩存的。所以說定義名稱要定義清楚。
3.實現緩存有兩種方式:在aspx頁面的頂部寫頁處理指令或者在cs代碼裏寫代碼(又叫緩存API),一種是靜態設置
,一各是動態設置。網上總有些人喜歡說來說去又不總結清楚,搞的人很煩。
4.實際上只要用到了緩存就一定有緩存依賴。只是有些不那麼明顯。在我看的文章裏一般都把緩存依賴單獨作爲一
章講解,這是好事,因爲在緩存的高級技術裏緩存依賴是很重要的,但這並不代表有些緩存就沒有緩存依賴。
好了,下面言歸正傳。我只講常用的東東。
1.頁面輸出緩存。其實用戶控件緩存跟它沒有大的區別,只有一個location不能使用,在這裏就一併講了吧。
page指令:
<%@ OutputCache Duration="10" VaryByParam="*" VaryByControl="txtInput" %>
OutputCache是指令名。
Duration是緩存時長,單位是秒。
VaryByParam是跟據什麼進行緩存。有兩個特殊的值:none表示不隨任何參數的不同而緩存,就是隻緩存一個版本,*
表示隨任何參數的不同而緩存,表示只要參數發生變化,就緩存一個新版本。
VaryByControl是跟據控件名進行緩存。這裏的控件是指一般的服務器控件,不能是用戶控件,不然會出現意想不到
的結果。
緩存API:
雖然頁面輸出緩存與用戶控件緩存在頁面指令方面差不多,但在api上面有所區別
頁面緩存api:
映射的是System.Web.HttpCachePolicy類。
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(3));
第一句對應的是Location,是說緩存在哪,public是哪裏都緩存,nocache是都不緩存,private是客戶端緩存,還有
其它幾個選項。比較關注的是:客戶端,代理服務器,服務器。
第二句對應的是Duration,是說緩存時長,這是個絕對時間,是說到了那個時就是取消緩存。
Response.Cache.VaryByParams["none"] = true;
對應的是VaryByParam
用中括號括起參數,中間可用分號分隔多個參數,true表示啓用此參數。
沒有對應VaryByControl的。
Response.Cache.SetSlidingExpiration(true);
當用了這一句的時候,所有緩存設置都不啓作用了,原因是這個屬性是用給代理服務器之類的處於瀏覽器和Web服務
器之間的緩存使用的,而不是給Web服務器本身的.是特意設計成這樣的.
Response.Cache.SetNoServerCaching()
表示取消當前所有服務器緩存。
用戶控件緩存api:
PartialCachingAttribute類,這是第一種方式
用戶控件也可以通過標明類屬性的方式完成緩存設置
在用戶控件的後臺代碼類上面加上:
[PartialCaching(int duration)]
[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom)]
[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom, bool
shared)]
[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom, string
sqlDependency, bool shared)]
在這裏的設置duration之類的與在page指令中投置duration之類的效果一樣
ControlCachePolicy類,這是第二種方式
在使用這種方式之前,必須保證用戶控件已使用page指令或PartialCachingAttribute類進行了封裝,否則會報異常
。
這個類是在動態加載用戶控件時使用的,沒有使用緩存時的加載具體請參看我的另外一篇文章:如何以編程方式加載用戶控件
PartialCachingControl my = (PartialCachingControl)LoadControl("usercon.ascx");
ControlCachePolicy cache = my.CachePolicy;
cache.Duration = TimeSpan.FromSeconds(3);
Controls.Add(my);
第一句是動態加載此用戶控件,當用戶控件啓動緩存後,asp.net會將其嵌入在PartialCachingControl類中,所以必
須強轉成PartialCachingControl。
第二句是獲取PartialCachingControl的CachePolicy屬性,是ControlCachePolicy類型,真正操作緩存的是這個類。
第三句是設置過期時間,沒什麼好說的
第四句是將動態生成的用戶控件加入到主目錄控件樹中,沒什麼好說的。
我在這裏只用了一個方法,其實它有很多方法,只要是在page指令裏能設置的這裏都可以進行設置。
在web.config中配置緩存
如果很多頁面或用戶控件使用相同的配置,則可以在web.config中進行配置後在page指令中統一調用。
在web.config中:
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="a" duration="3" varyByParam="none"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
在page指令中:
<%@ OutputCache CacheProfile="a" %>
綜上所述:
對於頁面輸出緩存,用page指令來完成靜態設置,用System.Web.HttpCachePolicy類來完成動態設置
對於用戶控件緩存,用page指令或PartialCachingAttribute類來完成靜態設置,用ControlCachePolicy類來完成動
態設置。
以上所說的都是對整體的緩存,頁面是一個整體,用戶控件相對來說也是一個整體,下面要說的是另外一種思路,
2.0新增的:整體緩存,部分替換,也就是說,只對頁面或者用戶控件的一部份進行更新。
有兩種方式:一種是使用控件,一種是控件api
使用substitution控件
從工具欄拖一個這樣的控件就可以了。它只有一個methodname屬性。該屬性用於獲取或者設置此控件相關聯的回調函
數名稱。此函數必須符合以下3個條件:
靜態方法
參數類型爲httpcontext
返回string類型的值
例如:在一個啓用的輸出緩存的頁面上使用這個控件:
<asp:Substitution ID="subText" runat="server" MethodName="GetData" />
然後在後臺寫下這樣的代碼:
public static string GetData(HttpContext context)
{
return DateTime.Now.ToString();
}
這樣頁面其它部分會進行緩存,但是這個地方會不停的打印新的時間。
注意:
substitution控件無法訪問頁面內的其它控件,只能使用傳遞給它的參數來訪問當前頁的上下文。
用戶控件不能使用此控件
此控件不能包含或自己呈現任何標記,顯示內容完全取決於方法的返回字符串。
使用控件api
主要就是Response.WriteSubstitution(getData)方法
它會將實時生成結果直接顯示在頁面最頂端,裏面那個方法名就是與上面所寫的方法一致就行了。而且用戶控件可以
使用此方法。
使用WriteSubstitution()方法有兩個好處。
第一,WriteSubstitution()方法引用的方法並不一定是當前類的方法。該方法可以是另一個實例或者另一個類的靜
態方法。
第二個好處是,可以在自定義控件中使用WriteSubstitution()方法來實現緩存後替換。
2。應用程序緩存
此部分內容請參看我的另外一篇文章:asp.net 的狀態管理與cache,在這篇文章裏我將應用程序緩存與緩存依賴一併講了。
參考文章
ASP.NET緩存:方法和最佳實踐
http://blog.csdn.net/jelink/archive/2006/09/11/1210241.aspx
ASP.NET緩存的SetSlidingExpiration
http://space.cnblogs.com/question/879/
即使 SetSlidingExpiration 方法設置爲,也會收到新網頁而不是緩存的網頁的滿足運行.NET Framework 2.0 的計
算機上
http://support.microsoft.com/kb/909643/zh-cn
ASP.NET 2.0的頁面緩存功能介紹
http://dev.yesky.com/msdn/498/2442998_1.shtml
4.3 使用部分頁面緩存
http://book.csdn.net/bookfiles/1002/100100230727.shtml