2019/3/25 9:28:55
要提升ASP.NET應用(yòng)程序的(de)性能(néng),最簡單、最有(yǒu)效的(de)方式就是使用(yòng)内建的(de)緩存引擎。雖然也(yě)能(néng)構建自己的(de)緩存,但(dàn)由于緩存引擎已提供了如(rú)此多的(de)功能(néng),所以完全不必如(rú)此麻煩。在很大(dà)程度上(shàng),ASP.NET開(kāi)發者在Web應用(yòng)程序中,能(néng)将緩存引擎的(de)功能(néng)直接包裝到(dào)自己的(de)數據表示及訪問類中。如(rú)本文(wén)所述,整個(gè)過程其實非常簡單。
ASP.NET的(de)緩存引擎支持三種類型的(de)緩存:
整頁輸出緩存是在一個(gè)頁被首次請求時,将整個(gè)頁呈現好的(de)HTML内容緩存下來。後續請求将直接取用(yòng)緩存拷貝。
部分(fēn)緩存是指緩存一部分(fēn)HTML内容,這類似一個(gè)Web用(yòng)戶控件(jiàn)的(de)輸出。之所以叫這樣的(de)一個(gè)名字,是因爲我們一般說“将一部分(fēn)HTML提交給一個(gè)頁”。
數據緩存關注的(de)是單獨的(de)變量或數據項的(de)緩存。它在比以上(shàng)兩種緩存類型都(dōu)要低的(de)一個(gè)級别上(shàng)工(gōng)作。
整頁輸出緩存
整頁輸出緩存是最簡單的(de)緩存類型,它隻要求爲準備緩存的(de)頁添加一個(gè)預處理(lǐ)指令OutputCache。使用(yòng)這種緩存,就不必重新處理(lǐ)一個(gè)頁的(de)Init,Load,PreRender,Render以及Unload事件(jiàn)。假如(rú)那些事件(jiàn)要訪問像數據庫那樣的(de)一個(gè)後端系統,那麽節省的(de)時間将是非常可(kě)觀的(de)。ASP.NET可(kě)緩存一個(gè)頁的(de)幾個(gè)變體,并将每個(gè)頁都(dōu)與後續請求相(xiàng)關聯。所有(yǒu)這些都(dōu)由OutputCache預處理(lǐ)指令來控制(zhì),該命令要放(fàng)在一個(gè)ASPX頁的(de)頂部,并采用(yòng)以下格式:
<%@ OutputCache
Duration="#ofseconds"
Location="Any | Client | Downstream | Server | None"
VaryByCustom="browser | customstring"
VaryByHeader="headers"
VaryByParam="parameter name" %>
OutputCache預處理(lǐ)指令最多可(kě)利用(yòng)5個(gè)相(xiàng)關的(de)屬性來控制(zhì)緩存行(xíng)爲。表A總結了這些屬性及其含義。表A屬性 說明(míng)
Duration 該屬性指定了網頁要緩存的(de)時間(以秒爲單位)。通過爲一個(gè)頁設置該屬性,可(kě)爲來自對象HTTP響應建立一個(gè)過期策略。這是一個(gè)必需屬性。如(rú)果不包括它,會(huì)發生解析器(qì)錯誤。注意它指定的(de)是絕對過期時間,而非周期性過期。
Location 用(yòng)這個(gè)屬性指示Web服務器(qì)和(hé)下遊設備(比如(rú)代理(lǐ)服務器(qì)和(hé)浏覽器(qì))來緩存頁面内容。默認爲Any,該屬性并非必需的(de)。
VaryByParam 該屬性使用(yòng)由分(fēn)号分(fēn)隔的(de)字符串列表來改變輸出緩存。默認情況下,這些字符串對應于随GET方法屬性發送的(de)查詢字符串值,或對應于使用(yòng)POST方法發送的(de)一個(gè)參數。如(rú)果将該屬性設爲多個(gè)參數,輸出緩存将針對指定的(de)每個(gè)參數,包含所請求的(de)文(wén)檔的(de)一個(gè)不同版本。可(kě)能(néng)的(de)值包括None、*以及任何有(yǒu)效的(de)查詢字符串或POST參數名。如(rú)果沒有(yǒu)設置其他(tā)屬性,該屬性就是必需的(de)。
VaryByCustom 對自定義輸出緩存需求進行(xíng)表示的(de)任何文(wén)本都(dōu)要包含在這個(gè)屬性中。如(rú)果爲屬性指派浏覽器(qì)的(de)一個(gè)值,緩存會(huì)根據浏覽器(qì)名稱及主版本信息而發生變化。如(rú)果輸入一個(gè)自定義字符串,就必須在應用(yòng)程序的(de)Global.asax文(wén)件(jiàn)中覆蓋GetVaryByCustomString方法。
VaryByHeader 該屬性使用(yòng)由分(fēn)号分(fēn)隔的(de)HTTP标頭列表來改變輸出緩存。如(rú)果屬性設爲多個(gè)标頭,輸出緩存将針對指定的(de)每個(gè)标頭,包含所請求文(wén)檔的(de)一個(gè)不同的(de)版本。OutputCache屬性
OutputCache預處理(lǐ)指令可(kě)在内存中方便地(dì)創建靜态頁的(de)單一版本,例如(rú):
<%@ OutputCache Duration=“300" VaryByParam="None" %>
還可(kě)根據id查詢字符串參數來緩存多個(gè)版本,例如(rú):
<%@ OutputCache Duration=“300" VaryByParam="id" %>
在上(shàng)述兩個(gè)例子中,網頁會(huì)在5分(fēn)鍾(300秒)後從緩存中清除,該數字是由Duration屬性指定的(de)。根據自定義信息來緩存
使用(yòng)VaryByCustom屬性,可(kě)根據您提供的(de)自定義信息來創建一個(gè)頁的(de)緩存版本。例如(rú),要爲每種類型的(de)浏覽器(qì)創建網頁的(de)一個(gè)不同版本,可(kě)使用(yòng)以下預處理(lǐ)指令:
<%@ OutputCache Duration=“300" VaryByParam="None" VaryByCustom=“browser”%>
使用(yòng)VaryByCustom,還可(kě)根據應用(yòng)程序特有(yǒu)的(de)信息來緩存網頁。例如(rú),要根據當前用(yòng)戶的(de)部門名稱來創建網頁的(de)緩存版本,可(kě)使用(yòng)以下預處理(lǐ)指令:
<%@ OutputCache Duration=“300" VaryByParam="None" VaryByCustom=“department”%>
然後,在用(yòng)于Global.asax文(wén)件(jiàn)的(de)代碼隐藏類中,可(kě)覆蓋GetVaryByCustomString方法,如(rú)以下VB.NET代碼所示:
Public Overrides Function GetVaryByCustomString( _
ByVal context As System.Web.HttpContext, _
ByVal custom As String) As String
If custom = "department" Then
' return the department for the current user
End If
End Function
這裏向GetVaryByCustomString方法傳遞了在預處理(lǐ)指令中使用(yòng)的(de)自定義值。ASP.NET運行(xíng)庫
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967