OutputCache屬性詳解(一)一Duration、VaryByParam


目錄

 

Duration與CacheProfile屬性

Duration:頁或用戶控件進行緩存的時間(以秒計)。在頁或用戶控件上設置該特性為來自對象的 HTTP 響應建立了一個過期策略,並將自動緩存頁或用戶控件輸出。

CacheProfile:與該頁關聯的緩存設置的名稱。這是可選特性,默認值為空字符串 ("")。 

 

測試OutputCache准備

在Visual Studio中,新建website項目,並修改頁面信息如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%=DateTime.Now %>
    </div>
    </form>
</body>
</html>

打開 Fiddler 工具,在瀏覽器中打開頁面,我們可以看 Fiddler 跟蹤到的響應信息如下:

並且每次刷新Fiddler所返回的狀態碼都是200,而且頁面輸出時間在不斷變化,如下:


我們修改項目,在website下的Web.config文件中添加如下配置:

  <system.web>
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
           <!--name 緩存配置名稱 duration 緩存的時間(以秒計) enabled 指定緩存有效 -->
          <add name="outputCache60" duration="60" enabled="true" varyByParam="*" />
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
    <compilation debug="true"/>
  </system.web>

並修改頁面信息為,增加 <%@ OutputCache CacheProfile="outputCache60"  %>:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ OutputCache CacheProfile="outputCache60"  %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <%=DateTime.Now %>  
    </div>
    </form>
</body>
</html>

 

同樣利用 Fiddler 跟蹤,得到的信息如下:

我們可以看到 Response Heades 所返回的Cache與不加緩存時返回的完全不一樣(多了 Date 和 Expires 節點),加緩存后的時間范圍與配置文件中時間一致,相差60秒(duration="60")。

加緩存后,第一次數據請求的狀態為200,而之后請求返回的狀態都是304,而且頁面所輸出的時間一直未變。 (超過60秒后第一次刷新,時間會變化,且狀態變為200)

HTTP 304: Not Modified 客戶端有緩沖的文檔並發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩沖的文檔還可以繼續使用。

 

VaryByParam屬性

分號分隔的字符串列表,用於使輸出緩存發生變化。默認情況下,這些字符串對應於使用 GET 方法特性發送的查詢字符串值,或者使用 POST 方法發送的參數。將該特性設置為多個參數時,對於每個指定參數組合,輸出緩存都包含一個不同版本的請求文檔。

可能的值包括 none、星號 (*) 以及任何有效的查詢字符串或 POST 參數名稱。

varyByParam="none" VaryByParam 設置為 none 時,將不考慮任何參數;無論提供什么附加參數,都將向所有用戶發送相同的頁:

下面是Fiddler跟蹤的信息:

可以看到,參數改變時數據請求都是200(第二次為304),但是頁面上的數據則全是相同的副本,如下:

 

VaryByParam =“*”對於每個唯一的請求參數組合,將緩存一個唯一頁

如圖中所示,不管所傳的參數為id,code還是para 只要值有所變化時,就會請求服務器,不會讀取緩存數據(需要注意的是資源文件如img,js,css等還是會走緩存的)

而且其頁面上的數值也是變化的,如下:

但是,將 VaryByParam 設置為 * 會緩存頁的許多不同版本,所以如果您知道緩存變化所依據的參數,建議您在 VaryByParam 特性中顯式指定這些參數。

如 varyByParam="id;code" 或者  varyByParam="id" 表示當 id;code 或者 id 參數變化時,發生給客戶端不同頁。

我這邊配置文件修改為

 <add name="outputCache60" duration="60" enabled="true" varyByParam="id;code" />

Fiddler跟蹤的信息如下:

參數改變都會當成一個新的數據請求,但是返回給客戶端的數據則不同,如下:

id和code變化時,輸出內容會隨參數變化,但para無論參數怎么變化,輸出的結果都是一樣的。

 

該章只是簡單介紹了Duration,CacheProfile,VaryByParam屬性 ,如有錯誤或者問題請各路大神指正!

 

作者:釋迦苦僧   出處:http://www.cnblogs.com/woxpp/p/3975209.html 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM