天天看點

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

1:減少靜态頁面請求

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

<a href="http://images.cnblogs.com/cnblogs_com/luminji/201109/201109131508274829.png"></a>

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

<a href="http://images.cnblogs.com/cnblogs_com/luminji/201109/201109131508285833.png"></a>

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

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

F5

代表浏覽器的一次重新整理,它對Last-Modified有效,但是對Cache-Control無效

點選“轉到”或者光标移入位址欄然後回車

對Cache-Control有效

CTRL+F5

強制重新整理,傳回所有正文

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

<a href="http://images.cnblogs.com/cnblogs_com/luminji/201109/201109131508306031.png"></a>

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

首次請求

傳回狀态碼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中進行設定,如下(在&lt;configuration&gt;下):

<code>&lt;</code><code>system.webServer</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>validation</code> <code>validateIntegratedModeConfiguration="false"/&gt;</code>

<code>  </code><code>&lt;</code><code>modules</code> <code>runAllManagedModulesForAllRequests="true"/&gt;</code>

<code>  </code><code>&lt;</code><code>staticContent</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>clientCache</code> <code>cacheControlMode="UseMaxAge" cacheControlMaxAge="0.00:00:60"/&gt;</code>

<code>  </code><code>&lt;/</code><code>staticContent</code><code>&gt;</code>

<code>&lt;/</code><code>system.webServer</code><code>&gt;</code>

1.2 關閉靜态檔案緩存

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

<code>&lt;</code><code>location</code> <code>path="test2.htm"&gt;</code>

<code>  </code><code>&lt;</code><code>system.webServer</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>staticContent</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>clientCache</code> <code>cacheControlMode="DisableCache"/&gt;</code>

<code>    </code><code>&lt;/</code><code>staticContent</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>system.webServer</code><code>&gt;</code>

<code>&lt;/</code><code>location</code><code>&gt;</code>

2:減少動态頁面請求

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

<code>protected</code> <code>void</code> <code>Page_Load(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>{</code>

<code>    </code><code>//處理點選“轉到”或者光标移入位址欄然後回車,也就是本文所闡述的</code>

<code>    </code><code>this</code><code>.Response.AddHeader(</code><code>"Cache-Control"</code><code>,</code><code>"max-age=60"</code><code>);</code>

<code>    </code><code>//真是用來處理F5重新整理的,也就是對Last-Modified有效</code>

<code>    </code><code>this</code><code>.Response.AddHeader(</code><code>"Last-Modified"</code><code>, DateTime.Now.ToString(</code><code>"U"</code><code>, DateTimeFormatInfo.InvariantInfo));</code>

<code>    </code><code>DateTime IfModifiedSince;</code>

<code>    </code><code>if</code> <code>(DateTime.TryParse(</code><code>this</code><code>.Request.Headers.Get(</code><code>"If-Modified-Since"</code><code>),</code><code>out</code> <code>IfModifiedSince))</code>

<code>    </code><code>{</code>

<code>        </code><code>if</code> <code>((DateTime.Now - IfModifiedSince.AddHours(8)).Seconds &lt; 60)</code>

<code>        </code><code>{</code>

<code>            </code><code>Response.Status =</code><code>"304 Not Modified"</code><code>;</code>

<code>            </code><code>Response.StatusCode = 304;</code>

<code>            </code><code>return</code><code>;</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

<code>}</code>

結果如下:

<a href="http://images.cnblogs.com/cnblogs_com/luminji/201109/201109131508329817.png"></a>

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

2.1使用配置檔案配置

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

<code>&lt;</code><code>system.web</code><code>&gt;</code>

<code>  </code><code>……</code>

<code>  </code><code>&lt;</code><code>caching</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>outputCacheSettings</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>outputCacheProfiles</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>add</code> <code>name="cache1" duration="60" location="Client" varyByParam="none"/&gt;</code>

<code>      </code><code>&lt;/</code><code>outputCacheProfiles</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>outputCacheSettings</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>caching</code><code>&gt;</code>

<code>&lt;/</code><code>system.web</code><code>&gt;</code>

然後在頁面前台引用:

<code>&lt;%@ OutputCache CacheProfile="cache1" %&gt;</code>

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

備注

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

本文轉自最課程陸敏技部落格園部落格,原文連結:http://www.cnblogs.com/luminji/archive/2011/09/14/2174751.html,如需轉載請自行聯系原作者

繼續閱讀