天天看點

OutputCache屬性詳解(二)一 Location

目錄

  • OutputCache概念學習
  • OutputCache屬性詳解(一)
  • OutputCache屬性詳解(二)
  • OutputCache屬性詳解(三)
  • OutputCache屬性詳解(四)— SqlDependency

Web應用程式中的使用緩存位置:

  • 用戶端緩存(Client Caching)
  • 代理緩存(Proxy Caching)
  • 反向代理緩存(Reverse Proxy Caching)
  • 伺服器緩存(Web Server Caching)

Location:OutputCacheLocation 枚舉值之一。

使用該枚舉指定的值。這些值确定頁輸出的緩存位置。預設值為 Any。

  • Any:輸出緩存可位于産生請求的浏覽器用戶端、參與請求的代理伺服器(或任何其他伺服器)或處理請求的伺服器上。此值對應于 HttpCacheability.Public 枚舉值。         
  • Client:輸出緩存位于産生請求的浏覽器用戶端上。此值對應于 HttpCacheability.Private 枚舉值。         
  • Downstream:輸出緩存可存儲在任何 HTTP 1.1 可緩存裝置中,源伺服器除外。這包括代理伺服器和送出請求的用戶端。         
  • None:對于請求的頁,禁用輸出緩存。此值對應于 HttpCacheability.NoCache 枚舉值。         
  • Server:輸出緩存位于處理請求的 Web 伺服器上。此值對應于 HttpCacheability.Server 枚舉值。         
  • ServerAndClient:輸出緩存隻能存儲在源伺服器或送出請求的用戶端中。代理伺服器不能緩存響應。此值對應于 HttpCacheability.Private 和 HttpCacheability.Server 枚舉值的組合。

測試前準備,建立WebSite站點,配置檔案增加:

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

增加兩個頁面Default.aspx和Default2.aspx如下:

<%@ 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>  
    <a href="Default2.aspx" target="_blank">Default2.aspx</a>
    </form>
</body>
</html>      
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

<!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 id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <%=DateTime.Now %>
    </div>
    <a href="Default.aspx" >Default.aspx</a>
    </form>
</body>
</html>      

Any:輸出緩存可位于産生請求的浏覽器用戶端、參與請求的代理伺服器(或任何其他伺服器)或處理請求的伺服器上。

<add name="outputCache60" duration="60" enabled="true" varyByParam="*" location="Any" />      

在用戶端,第一次請求為HTTP狀态碼為200,第二次請求的HTTP狀态碼為304

第一次HTTP的請求和響應資訊如下(200):

OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location

第二次HTTP的請求和響應資訊如下(304):

OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location

 我們可以看到,第二次請求時,請求标頭裡多了個 If-Modified-Since 和Last-Modified标簽:

  • 用戶端發HTTP請求時,使用If-Modified-Since标簽,把上次伺服器告訴它的檔案最後修改時間 傳回到伺服器端了。
  • 因為檔案被改動過,兩邊時間不一緻,是以伺服器傳回的HTTP狀态碼是200,并發送新頁面的全 部内容。
  • 伺服器傳回的HTTP頭标簽中有Last-Modified,告訴用戶端頁面的新的最後修改時間。

Cache-control 大家也可以看下

 并且第二次響應中并沒有來自服務端響應資料,Any在多個用戶端統一請求該頁面的情況下,回報給用戶端的資料都是一緻的,也就是從服務端擷取的。(PS:這點與Client不同),如下:

OutputCache屬性詳解(二)一 Location

 Client:輸出緩存位于産生請求的浏覽器用戶端上。

<add name="outputCache60" duration="60" enabled="true" varyByParam="*" location="Client" />      

第一次資料請求與響應情況如下:

OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location

用戶端緩存,如果使用者在浏覽器中點選“後退”按鈕或在位址欄中重新輸入URL,那麼在這種情況下,浏覽器将從緩存擷取頁面;然而,如果使用者點選“重新整理”按鈕,那麼浏覽器中緩存将失效,浏覽器發送頁面請求。但是浏覽器做回退操作時,本身就可以讀取自身的緩存資料,這樣抓取的資料沒有意義,是以我們第二次抓取的順序需要是:

1.第一次進入Default.aspx頁面(抓取一次Default.aspx)

2.點選 Default2.aspx 連結 

3.進入Deafult2.aspx頁面後,點選頁面中的Default.aspx連結跳轉回來(抓取一次Default.aspx)

這時候我們抓取的才是真正的304而不是浏覽器自帶的304。

第二次請求抓取的請求與相應資料,如下圖:

OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location

可以看出設定成Client時,第二次請求時,在請求頭中,用戶端與服務端的連結已經斷開,沒有任何請求服務端的操作,且響應的狀态碼為304,讀取本地緩存。

多個用戶端同時請求時,其回報的資料不一緻,如下:

OutputCache屬性詳解(二)一 Location

Downstream:輸出緩存可存儲在任何 HTTP 1.1 可緩存裝置中,源伺服器除外。這包括代理伺服器和送出請求的用戶端。  

<add name="outputCache60" duration="60" enabled="true" varyByParam="*" location="Downstream" />      

個人感覺Downstream與Clinet類似,隻不過有兩個小差別:

  • 資料存儲空間和資料存儲模式不一樣,後面會總結
  • Cache-Control,Client為private、Downstream 為 public

我們按照Clinet的方式繼續抓取兩次的請求與響應資訊如下:

第一次請求與響應:

OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location

第二次請求與響應,與clinet完全一緻,且在多個用戶端下資料也不同。

OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location

 None:對于請求的頁,禁用輸出緩存。此值對應于 HttpCacheability.NoCache 枚舉值。

<add name="outputCache60" duration="60" enabled="true" varyByParam="*" location="None" />      

我們繼續按抓取Clinet的方式抓取兩次請求和響應資訊,如下:

OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location

第二次請求與響應:

OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location

可以看到兩次的請求與響應一緻,且傳回狀态碼都是200,在Cache-Control資訊中為no-cache,響應資訊中也不夾帶任何緩存相關的标簽。

private、must-revalidate、max-age、no-cache 對于浏覽器操作的通路大家可以看下

關于Pragma:no-cache,跟Cache-Control: no-cache相同。Pragma: no-cache相容http 1.0 ,Cache-Control: no-cache是http 1.1提供的。是以,Pragma: no-cache可以應用到http 1.0 和http 1.1,而Cache-Control: no-cache隻能應用于http 1.1.

在多個用戶端請求時,頁面所展示的資訊不會一緻。

 Server:輸出緩存位于處理請求的 Web 伺服器上。此值對應于 HttpCacheability.Server 枚舉值。

<add name="outputCache60" duration="60" enabled="true" varyByParam="*" location="Server" />      

繼續按抓取Clinet的方式抓取兩次請求和響應資訊,如下:

OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location

可以看到HTTP請求與響應的資料與設定為None 類似,但是在多個用戶端的情況下,Server的資料能保持一緻,但None則不能。

OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location
OutputCache屬性詳解(二)一 Location

看請求與設定為Client差不多,但是Clinet在多用戶端下資料為不一緻的,但ServerAndClient在多用戶端下則能保持一緻

總結,如有問題或了解錯誤 歡迎指正。

  Any Client Downstream None Server ServerAndClient
第一次請求-狀态 200
IE浏覽器回退-狀态 304
IE浏覽器A标簽跳轉回歸-狀态
F5重新整理-狀态
多用戶端下情況 資料一緻 資料不一緻
資料存儲區域

1.用戶端

2.代理

3.伺服器

1.任何   HTTP 1.1 可緩存裝置

2.代理伺服器

3.請求用戶端

1.服務端 2.用戶端

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

作者:釋迦苦僧

出處:http://www.cnblogs.com/woxpp

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。

生活不易,五行缺金,求打點

OutputCache屬性詳解(二)一 Location

繼續閱讀