ASP.NET性能優(yōu)化之讓瀏覽器緩存動態(tài)網(wǎng)頁的方法
一:HTTP頭簡介
1.1瀏覽器第一次請求
假設(shè)我們請求一個URL地址,譬如我服務(wù)器上的一個靜態(tài)頁面http://192.168.0.77/luminji2/html/test1.htm,會返回如下的HTTP頭信息:
HTTP頭信息中每個參數(shù)的含義這里暫且不表,我們關(guān)注和本文論述相關(guān)的3個信息:
首先,響應(yīng)狀態(tài)200OK,即表示從服務(wù)器上抓取數(shù)據(jù)成功。
其次,Last-Modified:Fri, 09 Sep 2011 02:56:45 GMT
這是WEB服務(wù)器在告訴瀏覽器,我這個文件的最后修改日期是
Fri, 09 Sep 2011 02:56:45 GMT。必須要說明的是,它是GMT時間,也就是格林威治時間,一般中國境內(nèi)使用的是GMT+8時區(qū)(要看系統(tǒng)的區(qū)域設(shè)置而定)。
WEB服務(wù)器當(dāng)前響應(yīng)的這個對象的標(biāo)志值,就一個對象而言,比如一個 html 文件,如果被修改了,其 Etag 也會別修改。最后就是Etag,
1.2什么是瀏覽器緩存
我使用的是FireFox,在地址欄內(nèi)敲入about:cache?device=disk,我們就會看到被瀏覽器緩存起來的上面這個HTML頁面,如下:
(注意,這里的Last Modified和Http頭中的Last-Modified沒有任何關(guān)系)。
每種瀏覽器都會有自己的緩存機制,但是都差不多,這里暫且不表。
1.3如何命中緩存
再次請求剛才的URL,我們得到頭信息如下:
可以看到狀態(tài)變?yōu)?04 Not Modified了,這相當(dāng)于是WEB服務(wù)器告訴瀏覽器,請用自己的緩存,不要到我這里來下載正文內(nèi)容。那么,WEB服務(wù)器是根據(jù)什么來決定這樣告訴瀏覽器呢?
這里,我們就需要請求頭信息中的If-Modified-Since。請求頭是瀏覽器發(fā)送給WEB服務(wù)器的,一旦包含這個參數(shù),就是瀏覽器跟WEB服務(wù)器說:請查看自從Fri, 09 Sep 2011 02:56:45 GMT一來,你的內(nèi)容變動過沒。WEB服務(wù)器就會根據(jù)這個來判斷,如果沒有變動過,就會給瀏覽器返回304 Not Modified,就像本例。這樣子,瀏覽器就會去本地拿正文數(shù)據(jù),減少了網(wǎng)絡(luò)流量。
If-None-Match就是Etag判斷模式,跟Last-Modified其實完成的目的是一致的,這里暫且不表。
假設(shè)我們修改了文件test1.htm,試想會是什么結(jié)果,肯定是200OK。瀏覽器和WEB服務(wù)器之間就是通過這種機制來完成靜態(tài)網(wǎng)頁的緩存。
二:asp.net的瀏覽器緩存實現(xiàn)
上面我們說的是靜態(tài)頁面的情況,那么aspx頁面,也就是動態(tài)頁面會是怎么樣一種情況?現(xiàn)在,我們創(chuàng)建一個動態(tài)網(wǎng)頁來看一看。先來創(chuàng)建一個最簡單的aspx,如下:
<body>
<%=DateTime.Now %>
</body>
請求一下,得到的頭信息如下:
然后再多次請求一下,我們發(fā)現(xiàn)每次都是200OK,并且我們發(fā)現(xiàn)頭信息中丟了一個很重要的信息,那就是Last-Modified。服務(wù)器沒有告訴瀏覽器自己的對象的最后修改日期,那么瀏覽器就只好每次去服務(wù)器重新獲取全部數(shù)據(jù)了。看到這里,我們應(yīng)該明白了,要讓瀏覽器不去拿數(shù)據(jù),動態(tài)程序就得想法設(shè)法自己添加這個頭信息。
好的,現(xiàn)在我們就在ASPX的后臺代碼中這樣來實現(xiàn)一個最簡單的頭信息添加:
protected void Page_Load(object sender, EventArgs e)
{
this.Response.AddHeader("Last-Modified", DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo));
}
添加了頭信息后,我們發(fā)現(xiàn)再次請求URL后,頭信息變?yōu)槿缦拢?/P>
可以欣喜滴看到,響應(yīng)頭中包含了Last-Modified,而請求頭中則包含了If-Modified-Since。
當(dāng)然,我們?nèi)耘f發(fā)現(xiàn),每次請求還是200OK。這是當(dāng)然了,既然頭信息都是ASP.NET在后臺添加的,那么我們要返回什么樣的響應(yīng)狀態(tài)給服務(wù)器這段邏輯也得由自己來寫?,F(xiàn)在,我們假設(shè)我們要讓瀏覽器緩存10秒的時長,其完整的代碼應(yīng)該如下:
protected void Page_Load(object sender, EventArgs e)
{
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 < 10)
{
Response.Status = "304 Not Modified";
Response.StatusCode = 304;
return;
}
}
//其它
}
經(jīng)過這次修改后,如果我們在10秒內(nèi)持續(xù)請求該aspx頁面,則始終返回304狀態(tài),也即瀏覽器不會去服務(wù)器拿正文,只會在本地去讀取自己的緩存,這樣一來,服務(wù)器壓力自然就小了。如果我們10秒內(nèi)不對服務(wù)器請求這個頁面,則10秒后會返回200OK,即重新到服務(wù)器拿頁面數(shù)據(jù)。
現(xiàn)在,用AB來模擬100并發(fā)用戶進(jìn)行1000次請求,得到的比較結(jié)果如下(注意,為了強化效果,我們在后臺需要模擬一些比較耗時的動作,比如讀取數(shù)據(jù)庫):
左邊是未做緩存的aspx頁面,右邊是做了緩存的aspx頁面,可以看到,吞吐率相差10倍之多。
提示,使用ab進(jìn)行壓力測試的時候,需要加入If-Modified-Since的頭信息,命令如下:
C:\>ab -n1000 -c100 -H "If-Modified-Since: Friday, 09 September 2011 09:35:23 GMT" http://192.168.0.77/luminji2/aspx/test1.aspx
本文代碼下載:MvcApplication320110909.rar
三:問題的提出
在上面的說到的瀏覽器緩存實現(xiàn)中,瀏覽器通過和WEB服務(wù)器的溝通協(xié)調(diào)機制來確定自己是否需要調(diào)用緩存,這意味著動態(tài)程序仍舊需要處理來自客戶端的請求,如果有一種機制能夠讓瀏覽器不需要請求服務(wù)器就能夠決定是否調(diào)用緩存,就能徹底舍去服務(wù)器處理這一環(huán)節(jié)。下一篇將繼續(xù)闡述這種機制。
- ASP.NET性能優(yōu)化之局部緩存分析
- ASP.NET 性能優(yōu)化之反向代理緩存使用介紹
- ASP.NET性能優(yōu)化之構(gòu)建自定義文件緩存
- ASP.NET性能優(yōu)化小結(jié)(ASP.NET&C#)
- asp.net 程序性能優(yōu)化的七個方面 (c#(或vb.net)程序改進(jìn))
- ASP.NET比較常用的26個性能優(yōu)化技巧
- asp.net小談網(wǎng)站性能優(yōu)化
- ASP.NET性能優(yōu)化之減少請求
- ASP.NET技巧:同時對多個文件進(jìn)行大量寫操作對性能優(yōu)化
- asp.net性能優(yōu)化之使用Redis緩存(入門)
相關(guān)文章
Asp.net Core中實現(xiàn)自定義身份認(rèn)證的示例代碼
這篇文章主要介紹了Asp.net Core中實現(xiàn)自定義身份認(rèn)證的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05使用源鏈接對ASP.NET Core源代碼進(jìn)行調(diào)試
這篇文章介紹了使用源鏈接對ASP.NET Core源代碼進(jìn)行調(diào)試的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02利用ASP.NET MVC+Bootstrap搭建個人博客之打造清新分頁Helper(三)
這篇文章主要介紹了利用ASP.NET MVC+Bootstrap搭建個人博客之打造清新分頁Helper(三)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06ASP.NET中GridView、DataList、DataGrid三個數(shù)據(jù)控件foreach遍歷用法示例
這篇文章主要介紹了ASP.NET中GridView、DataList、DataGrid三個數(shù)據(jù)控件foreach遍歷用法,結(jié)合實例形式分析了GridView、DataList、DataGrid使用foreach及for語句進(jìn)行數(shù)據(jù)遍歷的具體使用方法,需要的朋友可以參考下2016-08-08Visual Studio 2010崩潰重啟問題(源文件編譯崩潰)
在使用Visual Studio 2010突然出現(xiàn)崩潰現(xiàn)象:源文件修改只要一編譯,馬上就崩潰.搜索了很多的方法也不見效果,經(jīng)過近1天的折騰,已經(jīng)決定重裝Windows 7了,遇到此問題的朋友們可以看看哦,或許對你有所幫助2013-01-01