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





