天天看點

ASP.NET性能優化之減少請求

在上篇《 ASP.NET性能優化之讓浏覽器緩存動态網頁

》中的方案中,浏覽器發送If-Modified-Since将是否需要使用自己的緩存交給WEB伺服器去決定,伺服器告知浏覽器去讀緩存,浏覽器才會去讀緩存。這種機制存在的性能損耗,就是伺服器的ASP.NET仍舊要接收請求,處理請求。此篇所講的機制是讓浏覽器自己去決定是否去讀緩存,這樣就徹底消滅了針對伺服器的請求。

1:減少靜态頁面請求

要讓靜态頁面支援這個需求,我們需要用到http頭中的Cache-Control: max-age。值得注意的是Cache-Control是在HTTP/1.1協定下的辨別,它是HTTP/1.0協定中的Expires的更新。為了讓靜态頁支援Cache-Control,一種方案是在IIS中進行設定,如下,我在需要靜态緩存的頁面或者檔案夾上右鍵->屬性:

ASP.NET性能優化之減少請求
我在這裡将過期時間設定為1分鐘,然後,我們通過HttpWatch觀察IE請求該頁面(第一次請求),得到的HTTP頭如下:
ASP.NET性能優化之減少請求

可以看到其得到的http頭中已經有了Cache-Control: max-age=60這一項。

現在,我需要在1分鐘内反複請求該靜态頁,請求的行為我們分别通過下面幾種方式來實作,

F5 代表浏覽器的一次重新整理,它對Last-Modified有效,但是對Cache-Control無效
點選“轉到”或者光标移入位址欄然後回車 對Cache-Control有效
CTRL+F5 強制重新整理,傳回所有正文

我們通過HttpWatch得到的結果如下:

ASP.NET性能優化之減少請求

需要注意我在圖中用紅字和紅框的辨別:

首次請求 傳回狀态碼200,顯然得到全部正文,為545位元組。
重新整理,對Last-Modified有效,它是讓伺服器判斷是否需要讀取緩存,是以,依然存在請求和傳回資料,我們可以看到,分别是352和239。狀态碼是304。
對Cache-Control有效,是浏覽器自己決定是否讀取緩存,由于是在1分鐘内,是以,浏覽器沒有向WEB伺服器發送請求,我們可以看到send和receive的資料全部是0。無互動,故無狀态碼。
ctrl+f5 相當于是強制重新整理,是以狀态碼200OK,傳回全部正文資料,我們可以看到和第一次請求是一樣的,為545位元組。

(題外話,上面的圖中有一個針對favicon.ico的404,我們應該始終為網站提供favicon.ico,它是你可以設定的網站LOGO,不然有些浏覽器會反複去請求該LOGO,這也會帶來性能損耗)。

經過上面的處理後,可以遇見我們相比上一篇更進一步減少了HTTP請求,提升了效率,因為總有一些使用者會通過“轉到”或者光标移入位址欄然後回車去請求資料。我們可以根據實際需求去設定特定頁面的緩存時間。

1.1 通過web.config設定靜态檔案緩存

在上面的示例中,我們通過IIS設定了靜态檔案的緩存,也可以在web.config中進行設定,如下(在<configuration>下):

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="0.00:00:60"/>
    </staticContent>
  </system.webServer>      

1.2 關閉靜态檔案緩存

也可以對單獨的檔案夾或者檔案關閉緩存,如下設定(在<configuration>下):

<location path="test2.htm">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="DisableCache"/>
      </staticContent>
    </system.webServer>
  </location>      

2:減少動态頁面請求

有了對以上靜态頁面或者說資源的分析之後,我們知道,可以對動态頁面請求采用相同的政策,這需要我們自己寫代碼實作:

protected void Page_Load(object sender, EventArgs e)
        {
            //處理點選“轉到”或者光标移入位址欄然後回車,也就是本文所闡述的
            this.Response.AddHeader("Cache-Control", "max-age=60");
            //真是用來處理F5重新整理的,也就是對Last-Modified有效
            this.Response.AddHeader("Last-Modified", DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo));
            DateTime IfModifiedSince;
            if (DateTime.TryParse(this.Request.Headers.Get("If-Modified-Since"), out IfModifiedSince))
            {
                if ((DateTime.Now - IfModifiedSince.AddHours(8)).Seconds < 60)
                {
                    Response.Status = "304 Not Modified";
                    Response.StatusCode = 304;
                    return;
                }
            }
        }      

結果如下:

ASP.NET性能優化之減少請求

該結果與我們使用靜态頁面完全一緻。

2.1使用配置檔案配置

也可以在配置檔案中批量對動态檔案進行配置,如下:

<system.web>
    ……
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="cache1" duration="60" location="Client" varyByParam="none"/>
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
  </system.web>      

然後在頁面前台引用:

<%@ OutputCache CacheProfile="cache1" %>      

本文代碼比較簡單,關鍵是要體會其中所蘊含的思想,即:把浏覽器當成你的網站的緩存的極其重要的一部分。

備注

在本篇中,我使用了AddHeader來進行http頭的添加,上篇中有朋友提出來使用Response.Cache.SetMaxAge方法,需要提醒的是,使用該方法,将導緻丢失304狀态。深層次原因不再細究。

ASP.NET性能優化之前篇:

1:《

ASP.NET性能優化之建構自定義檔案緩存

2:《

ASP.NET性能優化之減少請求

本文基于

Creative Commons Attribution 2.5 China Mainland License

釋出,歡迎轉載,演繹或用于商業目的,但是必須保留本文的署名

http://www.cnblogs.com/luminji

(包含連結)。如您有任何疑問或者授權方面的協商,請給我留言。

繼續閱讀