ASP.NET性能優(yōu)化之減少請求
1:減少靜態(tài)頁面請求
要讓靜態(tài)頁面支持這個(gè)需求,我們需要用到http頭中的Cache-Control: max-age。值得注意的是Cache-Control是在HTTP/1.1協(xié)議下的標(biāo)識,它是HTTP/1.0協(xié)議中的Expires的升級。為了讓靜態(tài)頁支持Cache-Control,一種方案是在IIS中進(jìn)行設(shè)置,如下,我在需要靜態(tài)緩存的頁面或者文件夾上右鍵->屬性:
我在這里將過期時(shí)間設(shè)置為1分鐘,然后,我們通過HttpWatch觀察IE請求該頁面(第一次請求),得到的HTTP頭如下:
可以看到其得到的http頭中已經(jīng)有了Cache-Control: max-age=60這一項(xiàng)。
現(xiàn)在,我需要在1分鐘內(nèi)反復(fù)請求該靜態(tài)頁,請求的行為我們分別通過下面幾種方式來實(shí)現(xiàn),
| F5 | 代表瀏覽器的一次刷新,它對Last-Modified有效,但是對Cache-Control無效 |
| 點(diǎn)擊“轉(zhuǎn)到”或者光標(biāo)移入地址欄然后回車 | 對Cache-Control有效 |
| CTRL+F5 | 強(qiáng)制刷新,返回所有正文 |
我們通過HttpWatch得到的結(jié)果如下:
需要注意我在圖中用紅字和紅框的標(biāo)識:
| 首次請求 | 返回狀態(tài)碼200,顯然得到全部正文,為545字節(jié)。 |
| F5 | 刷新,對Last-Modified有效,它是讓服務(wù)器判斷是否需要讀取緩存,所以,依然存在請求和返回?cái)?shù)據(jù),我們可以看到,分別是352和239。狀態(tài)碼是304。 |
| 點(diǎn)擊“轉(zhuǎn)到”或者光標(biāo)移入地址欄然后回車 | 對Cache-Control有效,是瀏覽器自己決定是否讀取緩存,由于是在1分鐘內(nèi),所以,瀏覽器沒有向WEB服務(wù)器發(fā)送請求,我們可以看到send和receive的數(shù)據(jù)全部是0。無交互,故無狀態(tài)碼。 |
| ctrl+f5 | 相當(dāng)于是強(qiáng)制刷新,所以狀態(tài)碼200OK,返回全部正文數(shù)據(jù),我們可以看到和第一次請求是一樣的,為545字節(jié)。 |
(題外話,上面的圖中有一個(gè)針對favicon.ico的404,我們應(yīng)該始終為網(wǎng)站提供favicon.ico,它是你可以設(shè)置的網(wǎng)站LOGO,不然有些瀏覽器會反復(fù)去請求該LOGO,這也會帶來性能損耗)。
經(jīng)過上面的處理后,可以遇見我們相比上一篇更進(jìn)一步減少了HTTP請求,提升了效率,因?yàn)榭傆幸恍┯脩魰ㄟ^“轉(zhuǎn)到”或者光標(biāo)移入地址欄然后回車去請求數(shù)據(jù)。我們可以根據(jù)實(shí)際需求去設(shè)定特定頁面的緩存時(shí)間。
1.1 通過web.config設(shè)置靜態(tài)文件緩存
在上面的示例中,我們通過IIS設(shè)置了靜態(tài)文件的緩存,也可以在web.config中進(jìn)行設(shè)置,如下(在<configuration>下):
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true"/>
<staticContent>
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="0.00:00:60"/>
</staticContent>
</system.webServer>
1.2 關(guān)閉靜態(tài)文件緩存
也可以對單獨(dú)的文件夾或者文件關(guān)閉緩存,如下設(shè)置(在<configuration>下):
<location path="test2.htm">
<system.webServer>
<staticContent>
<clientCache cacheControlMode="DisableCache"/>
</staticContent>
</system.webServer>
</location>
2:減少動態(tài)頁面請求
有了對以上靜態(tài)頁面或者說資源的分析之后,我們知道,可以對動態(tài)頁面請求采用相同的策略,這需要我們自己寫代碼實(shí)現(xiàn):
protected void Page_Load(object sender, EventArgs e)
{
//處理點(diǎn)擊“轉(zhuǎn)到”或者光標(biāo)移入地址欄然后回車,也就是本文所闡述的
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;
}
}
}
結(jié)果如下:
該結(jié)果與我們使用靜態(tài)頁面完全一致。
2.1使用配置文件配置
也可以在配置文件中批量對動態(tài)文件進(jìn)行配置,如下:
<system.web>
……
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="cache1" duration="60" location="Client" varyByParam="none"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
然后在頁面前臺引用:
<%@ OutputCache CacheProfile="cache1" %>
本文代碼比較簡單,關(guān)鍵是要體會其中所蘊(yùn)含的思想,即:把瀏覽器當(dāng)成你的網(wǎng)站的緩存的極其重要的一部分。
備注
在本篇中,我使用了AddHeader來進(jìn)行http頭的添加,上篇中有朋友提出來使用Response.Cache.SetMaxAge方法,需要提醒的是,使用該方法,將導(dǎo)致丟失304狀態(tài)。深層次原因不再細(xì)究。
- ASP.NET性能優(yōu)化之局部緩存分析
- ASP.NET 性能優(yōu)化之反向代理緩存使用介紹
- ASP.NET性能優(yōu)化之讓瀏覽器緩存動態(tài)網(wǎng)頁的方法
- ASP.NET性能優(yōu)化之構(gòu)建自定義文件緩存
- ASP.NET性能優(yōu)化小結(jié)(ASP.NET&C#)
- asp.net 程序性能優(yōu)化的七個(gè)方面 (c#(或vb.net)程序改進(jìn))
- ASP.NET比較常用的26個(gè)性能優(yōu)化技巧
- asp.net小談網(wǎng)站性能優(yōu)化
- ASP.NET技巧:同時(shí)對多個(gè)文件進(jìn)行大量寫操作對性能優(yōu)化
- asp.net性能優(yōu)化之使用Redis緩存(入門)
相關(guān)文章
Asp.net core中實(shí)現(xiàn)自動更新的Option的方法示例
這篇文章主要介紹了Asp.net core中實(shí)現(xiàn)自動更新的Option的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
.Net Core 使用NLog記錄日志到文件和數(shù)據(jù)庫的操作方法
這篇文章主要介紹了.Net Core 使用NLog記錄日志到文件和數(shù)據(jù)庫的操作方法,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07
解決asp.net Sharepoint無法連接發(fā)布自定義字符串處理程序,不能進(jìn)行輸出緩存處理的方法
解決Sharepoint無法連接發(fā)布自定義字符串處理程序,不能進(jìn)行輸出緩存處理的方法2010-03-03
C#中遍歷各類數(shù)據(jù)集合的方法總結(jié)
C#中遍歷各類數(shù)據(jù)集合的方法,這里自己做下總結(jié):枚舉類型、遍歷ArrayList(Queue、Stack)、Winform窗體中的控件、HashTable哈希表等等,具體祥看下文2013-05-05
ASP.NET?Core中Razor頁面與MVC區(qū)別介紹
這篇文章介紹了ASP.NET?Core中Razor頁面與MVC的區(qū)別,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02





