VS 2010 和 .NET 4.0 系列之《ASP.NET 4中的可擴充輸出快取》篇

  • 22621
  • 0
  • 2011-07-02

摘要:VS 2010 和 .NET 4.0 系列之《ASP.NET 4中的可擴充輸出快取》篇

【原文位址】Extensible Output Caching with ASP.NET 4 (VS 2010 and .NET 4.0 Series)
【原文發表日期】 Wednesday, January 27, 2010 11:27 PM

除了寫部落格外,我現在還使用Twitter發短貼和共享連結。請透過twitter.com/scottgu跟隨我。

這是我針對即將發佈的VS 2010 和 .NET 4所撰寫的 文章系列的第十四篇。今天的部落格討論ASP.NET 4中做的一些輸出快取擴充性方面的改進。這些改進可為所有的ASP.NET 4應用所用,包括那些用ASP.NET Web Forms和ASP.NET MVC建造的應用。

現今的輸出快取(Output Caching)

ASP.NET 1.0引進了輸出快取的概念,允許開發人員將網頁,控制項,控制器,和HTTP回復生成的輸出捕捉和保存在記憶體的快取中。然後在之後的web請求中,ASP.NET可以透過從快取中取出和使用現成的輸出(而不是再次執行網頁/控制器重新從頭生成輸出),快速地將內容傳出。這可以顯著地提高你應用的性能,特別是在你的內容是基於資料庫中的資料的情形下(因為當內容是輸出快取的,結果是你在後來的請求中不必再存取資料庫)。

ASP.NET的輸出快取系統是足夠靈活的,允許你根據網頁/控制器的查詢字串/表單提交參數來快取不同版本的內容(例如:Browse.aspx?category=Beverages 比之與 Browse.aspx?category=Meat)。它也允許你基於存取你的應用的客戶端的瀏覽器型別或者用戶語言選項來快取不同版本的內容。這允許你在快取為桌面瀏覽器優化的內容版本之外,再快取一個可移動設備的版本,以及根據用戶是想閱讀英文還是法文的網頁更改快取的條目。你可以配置ASP.NET在一個特定的時間內(例如,一分鐘,之後的下一個請求會重新生成內容並且再次快取)快取某個特定的輸出快取,你還可以配置ASP.NET基於某個外部事件(例如,快取內容基於的資料庫改變了)動態地使得快取條目失效。

但ASP.NET V1->V3.5中的輸出快取有一個限制,就是快取儲存本身不是可擴充的,- 快取的內容總是保存在記憶體中的。

ASP.NET 4的輸出快取擴充性

ASP.NET 4對輸出快取添加了擴充點,現在允許開發人員配置一個或多個定制的輸出快取提供者(output-cache provider)。輸出快取提供者可以使用任何儲存機制來永久化快取內容。這使得輕鬆地建立使用任何永久化機制來保存快取內容的輸出快取提供者成為可能, 這些永久化機制包括本地或遠程硬碟,資料庫,雲儲存,和分散式快取引擎(象memcached 或 velocity)。

你可以透過建立一個ASP.NET 4中的新System.Web.Caching.OutputCacheProvider類的繼承類來建立定制的輸出快取提供者。然後在你的繼承類中,你可以覆蓋4個公開方法,提供添加/刪除/獲取/更新快取內容的實現(會傳入一個獨特的鍵值,用於識別每個單獨的快取條目)。然後,你可以透過在應用的web.config文件中使用<outputCache>元素的新<providers>節將其註冊,配置ASP.NET 4來使用你定制的輸出快取提供者:

image

在上面,我加了一個新的輸出快取提供者(我將其命名為「SampleCache」),是用OutputCacheSample.dll程式集中的「ScottOutputCache」類別實現的。我還配置ASP.NET,將我的「SampleCache」實現作為預設的輸出快取實現來使用(每當內容需要輸出快取時),- 這是透過設定<outputCache>元素的 「defaultProvider」屬性實現的。

至此,當我在任意一個.aspx網頁的頂部加一個OutputCache指令時,內容就會透過使用我的ScottOutputCache提供者被快取和保存起來:

<%@ OutputCache Duration="60" VaryByParam="None"  %>

同樣地,如果我將[OutputCache]特性加到某個ASP.NET MVC控制器的任意一個action方法上時,內容也會透過使用我的ScottOutputCache提供者被快取和保存起來:

image

客制所用的輸出快取提供者

在上面,我配置ASP.NET總是預設使用我的「SampleCache」提供者來快取內容,每當輸出快取在應用中使用的話。

作為一個稍微更高級的選項,開發人員還可以配置ASP.NET在每個請求的基礎上動態地選擇某個輸出快取提供者。這對你想要稍微更豐富一點快取語意的場景是非常有用的。例如,你也許想要使用內建的ASP.NET記憶體提供者來快取網站的「首頁(Home)」或者「前十個請求最多的網頁」(因為內容在記憶體中,所以速度是超級地快),然後將存取數不多的網頁快取到硬碟上。

你可以透過覆蓋應用的Global.asax文件中的 GetOutputCacheProviderName() 方法,在每個請求的基礎上,動態指定使用哪個輸出快取提供者。在下面,我表明,對我應用中的 「Home.aspx」網頁我想要使用內建的,用記憶體的ASP.NET輸出快取提供者,然後對所有其他的請求,我想要使用註冊在web.config文件中的提供者:

image

這個根據場景輕鬆地轉換提供者的能力,最終將促成一堆非常強有力的場景。

常用的輸出快取提供者

我們將發佈例程,示範如何實現將快取內容保存在文件系統中的基於硬碟的輸出快取提供者。我們還將發佈例程,示範如何將輸出快取與新的 Windows Server AppFabric Caching Service (以前叫「Velocity」)互相整合。AppFabric的快取服務將是免費的,完全支持的微軟分散式快取系統。將新的 ASP.NET 4 輸出快取擴充性與memcached(很流行的開放原始碼分散式快取系統)互相整合也會是非常容易的。

你可以觀看Stefan Schackow在PDC 2009上的ASP.NET 4核心運行時講座來瞭解如何建立快取提供者的細節,你還可以從這個PDC 2009講座中瞭解AppFabric的快取服務的細節。

結語

ASP.NET
4中新加的輸出快取提供者擴充性將允許開發人員輕易地追求網站和應用更勇猛的,也更聰明的輸出快取策略。這將顯著地提高應用的性能和回應性,改進終端用戶的體驗,以及減少所需伺服器的資源量。

希望本文對你有所幫助,

Scott