OutputCache屬性詳解(二)一 Location


目錄

 

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):

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

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

  • 客戶端發HTTP請求時,使用If-Modified-Since標簽,把上次服務器告訴它的文件最后修改時間 返回到服務器端了。
  • 因為文件被改動過,兩邊時間不一致,所以服務器返回的HTTP狀態碼是200,並發送新頁面的全 部內容。
  • 服務器返回的HTTP頭標簽中有Last-Modified,告訴客戶端頁面的新的最后修改時間。

Cache-control 大家也可以看下

 並且第二次響應中並沒有來自服務端響應數據,Any在多個客戶端統一請求該頁面的情況下,反饋給客戶端的數據都是一致的,也就是從服務端獲取的。(PS:這點與Client不同),如下:

 

 

 Client:輸出緩存位於產生請求的瀏覽器客戶端上。

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

第一次數據請求與響應情況如下:

客戶端緩存,如果用戶在瀏覽器中點擊“后退”按鈕或在地址欄中重新輸入URL,那么在這種情況下,瀏覽器將從緩存獲取頁面;然而,如果用戶點擊“刷新”按鈕,那么瀏覽器中緩存將失效,瀏覽器發送頁面請求。但是瀏覽器做回退操作時,本身就可以讀取自身的緩存數據,這樣抓取的數據沒有意義,所以我們第二次抓取的順序需要是:

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

2.點擊 Default2.aspx 鏈接 

3.進入Deafult2.aspx頁面后,點擊頁面中的Default.aspx鏈接跳轉回來(抓取一次Default.aspx)

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

 

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

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

多個客戶端同時請求時,其反饋的數據不一致,如下:

 

Downstream:輸出緩存可存儲在任何 HTTP 1.1 可緩存設備中,源服務器除外。這包括代理服務器和發出請求的客戶端。  

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

個人感覺DownstreamClinet類似,只不過有兩個小區別:

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

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

第一次請求與響應:

第二次請求與響應,與clinet完全一致,且在多個客戶端下數據也不同。

 

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

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

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

第一次請求與響應:

第二次請求與響應:

可以看到兩次的請求與響應一致,且返回狀態碼都是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的方式抓取兩次請求和響應信息,如下:

 

可以看到HTTP請求與響應的數據與設置為None 類似,但是在多個客戶端的情況下,Server的數據能保持一致,但None則不能。

 

ServerAndClient:輸出緩存只能存儲在源服務器或發出請求的客戶端中。代理服務器不能緩存響應。此值對應於 HttpCacheability.Private 和 HttpCacheability.Server 枚舉值的組合。

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

看請求與設置為Client差不多,但是Clinet在多客戶端下數據為不一致的,但ServerAndClient在多客戶端下則能保持一致

 

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

 

  Any Client Downstream None Server ServerAndClient
第一次請求-狀態 200 200 200 200 200 200
IE瀏覽器回退-狀態 304 304 304 200 200 304
IE瀏覽器A標簽跳轉回歸-狀態 304 304 304 200 200 304
F5刷新-狀態 304 200 200 200 200 304
多客戶端下情況 數據一致 數據不一致 數據不一致 數據不一致 數據一致 數據一致
數據存儲區域 1.客戶端
2.代理
3.服務器
1.客戶端 1.任何   HTTP 1.1 可緩存設備
2.代理服務器
3.請求客戶端
1.服務端 1.服務端
2.客戶端

 

   

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


免責聲明!

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



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