天天看點

【轉載】ASP.NET 2.0中的頁面輸出緩存

靜态頁面全部内容儲存在伺服器記憶體中。當再有請求時,系統将緩存中的相關資料直接輸出,直到緩存資料過期。這個過程中,緩存不需要再次經過頁面處理生命周期。這樣可以縮短請求響應時間,提高應用程式性能。很顯然,頁面輸出緩存适用于不需要頻繁更新資料,而占用大量時間和資源才能編譯生成的頁面。對于那些資料經常更新的頁面,則不适用。預設情況下,ASP.NET 2.0啟用了頁面輸出緩存功能,但并不緩存任何響應的輸出。開發人員必須通過設定,使得某些頁面的響應成為緩存的一部分。

  設定頁面輸出緩存可以使用以下兩種方式:一種是使用@ OutputCache指令,另一種是使用頁面輸出緩存API。@ OutputCache指令曾經在ASP.NET 1.x中出現過,并在ASP.NET 2.0中得到了繼承和增強。頁面輸出緩存API主要是指HttpCachePolicy類。

   使用@ OutputCache指令

  使用@ OutputCache指令,能夠實作對頁面輸出緩存的一般性需要。@ OutputCache指令在ASP.NET頁或者頁中包含的使用者控件的頭部聲明。這種方式非常友善,隻需幾個簡單的屬性設定,就能夠實作頁面的輸出緩存政策。@ OutputCache指令聲明代碼如下。

@ OutputCache指令代碼
<%@ OutputCache CacheProfile=" " NoStore="True | False" Duration="#ofseconds" Shared="True | False" Location="Any | Client | Downstream | Server | None | ServerandClient " SqlDependency="database/table name pair | CommandNotification " VaryByControl="controlname" VaryByCustom="browser | customstring" VaryByHeader="headers" VaryByParam="parametername" %>

  如上所示,在@ OutputCache指令中,共包括10個屬性,它們是CacheProfile、NoStore、Duration、Shared、Location、SqlDependency、VaryByControl、VaryByCustom、VaryByHeader和VaryByParam。這些屬性将對緩存時間、緩存項的位置、SQL資料緩存依賴等各方面進行設定。下面簡要介紹以上屬性的基本概念。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

CacheProfile

  用于定義與該頁關聯的緩存設定的名稱。是可選屬性,預設值為空字元("")。需要注意的是,包含在使用者控件中的@ OutputCache指令不支援此屬性。在頁面中指定此屬性時,屬性值必須與Web.config檔案<outputCacheSettings>配置節下的outputCacheProfiles元素中的一個可用項的名稱比對。如果此名稱與配置檔案項不比對,将引發異常。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

NoStore

  該屬性定義一個布爾值,用于決定是否阻止敏感資訊的二級存儲。需要注意的是,包含在使用者控件中的@ OutputCache指令不支援此屬性。将此屬性設定為true等效于在請求期間執行代碼“Response.Cache.SetNoStore();”。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

Duration

  用于設定頁面或者使用者控件緩存的時間。機關是秒。通過設定該屬性,能夠為來自對象的HTTP響應建立了一個過期政策,并将自動緩存頁或使用者控件輸出。需要注意的是,Duration屬性是必需的,否則将會引起分析器錯誤。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

Shared

  該屬性定義一個布爾值,用于确定使用者控件輸出是否可以由多個頁共享。預設值為false。注意,包含在ASP.NET頁中的@ OutputCache指令不支援此屬性。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

Location

  用于指定輸出緩存項的位置。其屬性值是OutputCacheLocation枚舉值,它們是Any、Client、Downstream、None、Server和ServerAndClient。預設值是Any,表示輸出緩存可用于所有請求,包括用戶端浏覽器、代理伺服器或處理請求的伺服器上。需要注意的是,包含在使用者控件中的@ OutputCache指令不支援此屬性。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

SqlDependency

  該屬性辨別一組資料庫/表名稱對的字元串值,頁或控件的輸出緩存依賴于這些名稱對。需要注意:SqlCacheDependency類監視輸出緩存所依賴的資料庫中的表,是以,當更新表中的項時,使用基于表的輪詢将從緩存中移除這些項。當通知(在SQL Server 2005中)與CommandNotification值一起使用時,最終将使用SqlDependency類向SQL Server 2005伺服器注冊查詢通知。另外,SqlDependency屬性的CommandNotification值僅在ASP.NET頁中有效。控件隻能将基于表的輪詢用于@ OutputCache指令。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

VaryByControl

  該屬性使用一個分号分隔的字元串清單來更改使用者控件的輸出緩存。這些字元串代表在使用者控件中聲明的ASP.NET伺服器控件的ID屬性值。除非已經包含了VaryByParam屬性,否則在@ OutputCache指令中,該屬性是必需的。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

VaryByCustom

  用于自定義輸出緩存要求的任意文本。如果賦予該屬性值是browser,緩存将随浏覽器名稱和主要版本資訊的不同而異。如果輸入了自定義字元串,則必須在應用程式的Global.asax檔案中重寫HttpApplication.GetVaryByCustomString方法。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

VaryByHeader

  該屬性中包含由分号分隔的HTTP标頭清單,用于使輸出緩存發生變化。當将該屬性設為多标頭時,對于每個指定的标頭,輸出緩存都包含一個請求文檔的不同版本。VaryByHeader屬性在所有HTTP 1.1緩存中啟用緩存項,而不僅限于ASP.NET緩存。使用者控件中的@ OutputCache指令不支援此屬性。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

VaryByParam

  該屬性定義了一個分号分隔的字元串清單,用于使輸出緩存發生變化。預設情況下,這些字元串與用GET方法屬性發送的查詢字元串值對應,或與用POST方法發送的參數對應。當将該屬性設定為多參數時,對于每個指定的參數,輸出緩存都包含一個請求文檔的不同版本。可能的值包括“none”、“*”和任何有效的查詢字元串或POST參數名稱。值得注意的是,在輸出緩存ASP.NET頁時,該屬性是必需的。它對于使用者控件也是必需的,除非已經在使用者控件的@ OutputCache指令中包含了VaryByControl屬性。如果沒有包含,則會發生分析器錯誤。如果不需要使緩存内容随任何指定參數發生變化,則可将該值設為“none”。如果要使輸出緩存根據所有參數值發生變化,則将屬性設定為“*”。

  下面列舉了兩個使用@OutputCache指令的示例代碼。

使用@ OutputCache的示例代碼1
<%@ OutputCache Duration="100" VaryByParam="none"%>

  以上示例是@ OutputCache指令的基本應用,其訓示頁面輸出緩存的有效期是100秒,并且頁面不随任何GET或POST參數改變。在該頁仍被緩存時接收到的請求由緩存資料提供服務。經過100秒後,将從緩存中移除該頁資料,并随後顯式處理下一個請求并再次緩存頁。

使用@ OutputCache的示例代碼2
<%@ OutputCache Duration="100" VaryByParam="location;firstname" %>

  以上@ OutputCache指令設定頁面輸出緩存的有效期是100秒,并且根據查詢字元串參數location或者firstname來設定輸出緩存。例如,假設用戶端請求是“http://localhost/default.aspx?location=beijing”,那麼該頁面将被作為緩存處理。

使用頁面輸出緩存API

  上文介紹了使用@ OutputCache指令實作對于輸出緩存的各項設定。這種方法簡單易行,深得開發人員青睐。另外,ASP.NET 2.0還從ASP.NET 1.x中繼承和擴充了一種使用輸出緩存API來程式設計設定頁面輸出緩存的方法。該方法的核心是調用System.Web.HttpCachePolicy。該類主要包含用于設定緩存特定的HTTP标頭的方法和用于控制ASP.NET頁面輸出緩存的方法。與.NET Framework 1.x中的HttpCachePolicy類相比,.NET Framework 2.0中的HttpCachePolicy類得到了擴充和發展。主要是增加了一些重要方法,例如,SetOmitVarStar方法等。由于HttpCachePolicy類方法衆多,下面簡要說明一些常用方法。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

SetExpires方法

  用于設定緩存過期的絕對時間。它的參數是一個DataTime類的執行個體,表示過期的絕對時間。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

SetLastModified方法

  用于設定頁面的Last-Modified HTTP标頭。Last-Modified HTTP标頭表示頁面上次修改時間,緩存将依靠它來進行計時。如果違反了緩存限制層次結構,此方法将失敗。該方法的參數是一個DataTime類的執行個體。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

SetSlidingExpiration方法

  該方法将緩存過期從絕對時間設定為可調時間。其參數是一個布爾值。當參數為true時,Cache-Control HTTP标頭将随每個響應而更新。此過期模式與相對于目前時間将過期标頭添加到所有輸出集的IIS配置選項相同。當參數為false時,将保留該設定,且任何啟用可調整過期的嘗試都将靜态失敗。此方法不直接映射到HTTP标頭。它由後續子產品或輔助請求來設定源伺服器緩存政策。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

SetOmitVaryStar方法

  ASP.NET 2.0新增的方法。用于指定在按參數進行區分時,響應是否應該包含vary:*标頭。方法參數是一個布爾值,若要訓示HttpCachePolicy不對其VaryByHeaders屬性使用*值,則為true;否則為false。

  

【轉載】ASP.NET 2.0中的頁面輸出緩存

SetCacheability方法

  用于設定頁面的Cache-Control HTTP标頭。該标頭用于控制在網絡上緩存文檔的方式。該方法有兩種重載方式,所不同的是參數。一種重載方法的參數是HttpCacheability枚舉值,包括NoCache、Private、Public、Server、ServerAndNoCache和ServerAndPrivate(有關這些枚舉值的定義,可參考MSDN)。另一種方法的參數有兩個,一個參數是HttpCacheability枚舉值,另一個參數是字元串,表示添加到标頭的緩存控制擴充。需要注意的是,僅當與Private或NoCache指令一起使用時,字段擴充名才有效。如果組合不相容的指令和擴充,則此方法将引發無效參數異常。

  下面舉例說明頁面緩存API的HttpCachePolicy類的使用方法。

HttpCachePolicy類示例源代碼

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));

Response.Cache.SetExpires(DateTime.Parse("6:00:00PM"));

  Response類的Cache屬性用于擷取頁面緩存政策。該屬性的資料類型是HttpCachePolicy。可通過調用Response.Cache來擷取HttpCachePolicy執行個體,進而實作對于目前頁面輸出緩存的設定。如上代碼所示,第一行代碼表示輸出緩存時間是60秒,并且頁面不随任何GET或POST參數改變,等同于“<%@ OutputCache Duration="60" VaryByParam="none" %>”。第二行代碼設定緩存過期的絕對時間是當日下午6時整。  

繼續閱讀