介紹
大量的網站頁面是採用動態方式,根據使用者提交的不同請求建立產生頁面。正如我們所知的,動態網頁面有助於根據使用者要求來提供定製的動態內容。動態網頁面也利於擷取在資料庫中每時每刻更新的資料。缺點是為每個使用者請求產生同一頁面增加了系統開銷。
為克服此問題,一些網站用頁面產生引擎對所有頁面產生html靜態頁面。但這樣產生的頁面對所有使用者的請求內容都是相同。
ASP.NET 提供了緩衝技術有助於我們最大程度地解決這個問題。它能緩衝輸出的頁面,儲存在儲存空間當中,緩衝使用者請求的內容。緩衝的特點可以根據不方式來定製的。
緩衝一個頁面
為緩衝一個頁面輸出的內容,我們要在面面頂部指定一個 @OutputCache 命令。文法如下所示:
<%@ OutputCache Duration=5 VaryByParam="None" %>
如你所見,這條指令有兩個屬性。他們是:
Duration - 被緩衝輸出的內容有效期間是多少秒。在時間超過指定的有效期間後,到期的緩衝內容會刪除,並會在下次使用者請求中重新調用頁面產生緩衝內容。再次的緩衝內容過10秒後此過程又會重複。
VaryByParam - 這個屬性是必須的,並且指明查詢字串參數不同使緩衝產生變化。在上面的代碼片斷中,我們指定 VaryByParam 屬性是 “None” ,這意味著不論傳遞的查詢字串參數如何不同所返回的頁面內容是相同的。
如果對同一頁面的兩次請求含不同的查詢字串參數,如:.../PageCachingByParam.aspx?id=12 和.../PageCachingByParam.aspx?id=15 ,這應該產生不同的頁面內容,指令應該是:
<%@ OutputCache Duration=10 VaryByParam="id" %>
對這樣兩種不同請求的頁面內容每一個都會被緩衝 Duration 屬性指定的時間長度。。
為了指定多個參數的情形,要使用分號來分隔參數名稱。如果我們指定 VaryByParam 屬性為“*”,緩衝內容會因傳遞的不同查詢字串參數而不同。
一些動態網頁面要根據不同的瀏覽來產生不同的內容。在這種情況下就要規定緩衝輸出內容要因不同瀏覽器而不同。@OutputCache 命令要改為:
<%@ OutputCache Duration=5 VaryByParam="id" VaryByCustom="browser" %>
這條指令不僅讓緩衝輸出內容因瀏覽器不同而不同,而且也會因瀏覽器版本不同而不同,如 IE5、IE 6、Netscape 4、Netscape 6 都會獲得不同輸出的緩衝版本。
緩衝局部頁面
有時我們可能只是想緩衝一個頁面的一小部分。例如,我們可能用這樣的頁面,對所有瀏覽使用者都有同樣的內容,這個頁面有一個標題。這個標題可能是某個文本/圖象組成,並且每天資料都可能改變。在這種情況下,我們就會只想緩衝這個標題一天的有效期間。
解決方案是把標題內容放入一個使用者控制項當中,然後指定這個使用者控制項應該被緩衝。這個技術被稱為局部緩衝(fragment caching)。
為了指定應該被緩衝的使用者控制項,我們利用 @OutputCache 指令,就象整個頁面緩衝的用法一樣。
<%@ OutputCache Duration=10 VaryByParam="None" %>
在上面的指令中,使用者控制項緩衝有效期間是 Duration 屬性指定的時間(10 秒)。不論查詢字串和瀏覽器類型/版本如何,緩衝輸出的內容是相同的。。
資料緩衝
ASP.NET 也支援作為物件類型資料的緩衝。我們可以把Object Storage Service在記憶體中,在我們應用程式的不同動態網頁面中使用它們。利用 Cache 類可以實現這個特點。緩衝的生存周期與應用程式的相同。對象可以以索引值對(name value pairs)的形式儲存於緩衝當中。如下所示插入一個字串進緩衝:
Cache["name"]="Smitha";
這個儲存的字串值可以象這樣得到:
if (Cache["name"] != null)
Label1.Text= Cache["name"].ToString();
為把對象插入緩衝中,可以使用 Cache 類的 Add 方法或者不同版本的 Insert 方法。這些方法可能允許我們使用這個 Cache 類提供的更強大功能,下面是利用了 Insert 方法的一個重載:
Cache.Insert("Name", strName,
new CacheDependency(Server.MapPath("name.txt"),
DateTime.Now.AddMinutes(2), TimeSpan.Zero);
頭兩個參數是是鍵名和被插入的對象。第三個參數是 CacheDependency 類型,幫我們對名為 name.txt 檔案設定值的依賴項。因此一旦這個檔案發生改變,在緩衝中的這個值會被刪除。我們可以指定 “null” 值來表明沒有依賴項。第四個參數指定了從緩衝刪除這個值的時間。最後一個參數是緩衝到期時間可調的參數,它指明了從最後一次訪問緩衝時間到它被刪除的時間間隔。
當可用系統記憶體不多時,緩衝自動從記憶體中刪除使用少的項目。這個過程被稱為淨化(scavenging)。我們可以為添加進緩衝中的項目指定優先順序,以便某些項目能得到優先處理:
Cache.Insert("Name", strName,
new CacheDependency(Server.MapPath("name.txt"),
DateTime.Now.AddMinutes(2), TimeSpan.Zero,
CacheItemPriority.High, null);
枚舉類型 CacheItemPriority 給成員設定不同的優先順序。CacheItemPriority.High 給項目分配了個高優先順序,以使該項目減少被緩衝刪除的可能性。
要點
如果你還是老的 ASP 頁面並且利用 Response.Expires 屬性快取頁面面輸出,那麼他們也可以象 ASP.NET 支援這個屬性一樣被保留。
Cache 類的 Insert 方法會用相同鍵名的項目覆蓋任何已存在項目。
CacheItemPriority.NotRemovable 優先值可以與 Cache.Insert 方法一起用於設定一個項目的優先順序,以便這個項目不會在淨化期間從緩衝中被刪除
結語
本文中,我儘可能對 ASP.NET 的緩衝技術多個可選方便提供一個總的概括。為保持本文的簡短扼要沒有提供詳細的解釋和說明。
在一個啟用緩衝的含子控制項嵌套風格中可用局部緩衝。我還沒有測試如何利用這一點,因此也就沒有包括這個技巧的說明。同時 Cache 類的 Insert 方法也就沒有在此討論了。我希望本文對讀者而言是一個研究多姿多彩的 ASP.NET 世界的一個良好的開端。
說明
本文範例源碼下載。原始碼中提供了各種緩衝技術執行個體。使用 index.htm 頁面可以看到所有例子的列表。