欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET性能優(yōu)化之讓瀏覽器緩存動(dòng)態(tài)網(wǎng)頁(yè)的方法

 更新時(shí)間:2011年09月16日 22:59:32   作者:  
上一篇《ASP.NET性能優(yōu)化之構(gòu)建自定義文件緩存》我們通過(guò)OutputCache,讓請(qǐng)求去訪問(wèn)服務(wù)器asp.net的輸出緩存,我們擴(kuò)展了OutputCacheProvider,這相當(dāng)于是訪問(wèn)服務(wù)器上的靜態(tài)資源。
OutputCache是針對(duì)所有訪問(wèn)服務(wù)器資源的用戶,本篇要介紹的瀏覽器緩存則是針對(duì)單個(gè)用戶,讓瀏覽器在我們的控制下徹底不持續(xù)訪問(wèn)服務(wù)器上的動(dòng)態(tài)內(nèi)容,也就是我們要讓瀏覽器變成我們的緩存機(jī)制中的一部分,在某些特定的場(chǎng)景下最大化地提升ASP.NET站點(diǎn)的性能。如果說(shuō)OutputCache是從廣度上提升并發(fā)效率,則瀏覽器緩存是從深度上提升效率。

一:HTTP頭簡(jiǎn)介

1.1瀏覽器第一次請(qǐng)求

假設(shè)我們請(qǐng)求一個(gè)URL地址,譬如我服務(wù)器上的一個(gè)靜態(tài)頁(yè)面http://192.168.0.77/luminji2/html/test1.htm,會(huì)返回如下的HTTP頭信息:

image

HTTP頭信息中每個(gè)參數(shù)的含義這里暫且不表,我們關(guān)注和本文論述相關(guān)的3個(gè)信息:

首先,響應(yīng)狀態(tài)200OK,即表示從服務(wù)器上抓取數(shù)據(jù)成功。

其次,Last-Modified:Fri, 09 Sep 2011 02:56:45 GMT

這是WEB服務(wù)器在告訴瀏覽器,我這個(gè)文件的最后修改日期是Fri, 09 Sep 2011 02:56:45 GMT。必須要說(shuō)明的是,它是GMT時(shí)間,也就是格林威治時(shí)間,一般中國(guó)境內(nèi)使用的是GMT+8時(shí)區(qū)(要看系統(tǒng)的區(qū)域設(shè)置而定)。

最后就是Etag,WEB服務(wù)器當(dāng)前響應(yīng)的這個(gè)對(duì)象的標(biāo)志值,就一個(gè)對(duì)象而言,比如一個(gè) html 文件,如果被修改了,其 Etag 也會(huì)別修改。

1.2什么是瀏覽器緩存

我使用的是FireFox,在地址欄內(nèi)敲入about:cache?device=disk,我們就會(huì)看到被瀏覽器緩存起來(lái)的上面這個(gè)HTML頁(yè)面,如下:

image

(注意,這里的Last Modified和Http頭中的Last-Modified沒(méi)有任何關(guān)系)。

每種瀏覽器都會(huì)有自己的緩存機(jī)制,但是都差不多,這里暫且不表。

1.3如何命中緩存

再次請(qǐng)求剛才的URL,我們得到頭信息如下:

image

可以看到狀態(tài)變?yōu)?04 Not Modified了,這相當(dāng)于是WEB服務(wù)器告訴瀏覽器,請(qǐng)用自己的緩存,不要到我這里來(lái)下載正文內(nèi)容。那么,WEB服務(wù)器是根據(jù)什么來(lái)決定這樣告訴瀏覽器呢?

這里,我們就需要請(qǐng)求頭信息中的If-Modified-Since。請(qǐng)求頭是瀏覽器發(fā)送給WEB服務(wù)器的,一旦包含這個(gè)參數(shù),就是瀏覽器跟WEB服務(wù)器說(shuō):請(qǐng)查看自從Fri, 09 Sep 2011 02:56:45 GMT一來(lái),你的內(nèi)容變動(dòng)過(guò)沒(méi)。WEB服務(wù)器就會(huì)根據(jù)這個(gè)來(lái)判斷,如果沒(méi)有變動(dòng)過(guò),就會(huì)給瀏覽器返回304 Not Modified,就像本例。這樣子,瀏覽器就會(huì)去本地拿正文數(shù)據(jù),減少了網(wǎng)絡(luò)流量。

If-None-Match就是Etag判斷模式,跟Last-Modified其實(shí)完成的目的是一致的,這里暫且不表。

假設(shè)我們修改了文件test1.htm,試想會(huì)是什么結(jié)果,肯定是200OK。瀏覽器和WEB服務(wù)器之間就是通過(guò)這種機(jī)制來(lái)完成靜態(tài)網(wǎng)頁(yè)的緩存。

二:asp.net的瀏覽器緩存實(shí)現(xiàn)

上面我們說(shuō)的是靜態(tài)頁(yè)面的情況,那么aspx頁(yè)面,也就是動(dòng)態(tài)頁(yè)面會(huì)是怎么樣一種情況?現(xiàn)在,我們創(chuàng)建一個(gè)動(dòng)態(tài)網(wǎng)頁(yè)來(lái)看一看。先來(lái)創(chuàng)建一個(gè)最簡(jiǎn)單的aspx,如下:

復(fù)制代碼 代碼如下:

<body>
<%=DateTime.Now %>
</body>

請(qǐng)求一下,得到的頭信息如下:

image

然后再多次請(qǐng)求一下,我們發(fā)現(xiàn)每次都是200OK,并且我們發(fā)現(xiàn)頭信息中丟了一個(gè)很重要的信息,那就是Last-Modified。服務(wù)器沒(méi)有告訴瀏覽器自己的對(duì)象的最后修改日期,那么瀏覽器就只好每次去服務(wù)器重新獲取全部數(shù)據(jù)了。看到這里,我們應(yīng)該明白了,要讓瀏覽器不去拿數(shù)據(jù),動(dòng)態(tài)程序就得想法設(shè)法自己添加這個(gè)頭信息。

好的,現(xiàn)在我們就在ASPX的后臺(tái)代碼中這樣來(lái)實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的頭信息添加:

復(fù)制代碼 代碼如下:

protected void Page_Load(object sender, EventArgs e)
{
this.Response.AddHeader("Last-Modified", DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo));
}

添加了頭信息后,我們發(fā)現(xiàn)再次請(qǐng)求URL后,頭信息變?yōu)槿缦拢?/P>

image

可以欣喜滴看到,響應(yīng)頭中包含了Last-Modified,而請(qǐng)求頭中則包含了If-Modified-Since。

當(dāng)然,我們?nèi)耘f發(fā)現(xiàn),每次請(qǐng)求還是200OK。這是當(dāng)然了,既然頭信息都是ASP.NET在后臺(tái)添加的,那么我們要返回什么樣的響應(yīng)狀態(tài)給服務(wù)器這段邏輯也得由自己來(lái)寫。現(xiàn)在,我們假設(shè)我們要讓瀏覽器緩存10秒的時(shí)長(zhǎng),其完整的代碼應(yīng)該如下:

復(fù)制代碼 代碼如下:

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)過(guò)這次修改后,如果我們?cè)?0秒內(nèi)持續(xù)請(qǐng)求該aspx頁(yè)面,則始終返回304狀態(tài),也即瀏覽器不會(huì)去服務(wù)器拿正文,只會(huì)在本地去讀取自己的緩存,這樣一來(lái),服務(wù)器壓力自然就小了。如果我們10秒內(nèi)不對(duì)服務(wù)器請(qǐng)求這個(gè)頁(yè)面,則10秒后會(huì)返回200OK,即重新到服務(wù)器拿頁(yè)面數(shù)據(jù)。

現(xiàn)在,用AB來(lái)模擬100并發(fā)用戶進(jìn)行1000次請(qǐng)求,得到的比較結(jié)果如下(注意,為了強(qiáng)化效果,我們?cè)诤笈_(tái)需要模擬一些比較耗時(shí)的動(dòng)作,比如讀取數(shù)據(jù)庫(kù)):

image

左邊是未做緩存的aspx頁(yè)面,右邊是做了緩存的aspx頁(yè)面,可以看到,吞吐率相差10倍之多。

提示,使用ab進(jìn)行壓力測(cè)試的時(shí)候,需要加入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

三:?jiǎn)栴}的提出

在上面的說(shuō)到的瀏覽器緩存實(shí)現(xiàn)中,瀏覽器通過(guò)和WEB服務(wù)器的溝通協(xié)調(diào)機(jī)制來(lái)確定自己是否需要調(diào)用緩存,這意味著動(dòng)態(tài)程序仍舊需要處理來(lái)自客戶端的請(qǐng)求,如果有一種機(jī)制能夠讓瀏覽器不需要請(qǐng)求服務(wù)器就能夠決定是否調(diào)用緩存,就能徹底舍去服務(wù)器處理這一環(huán)節(jié)。下一篇將繼續(xù)闡述這種機(jī)制。

相關(guān)文章

  • Asp.net Core中實(shí)現(xiàn)自定義身份認(rèn)證的示例代碼

    Asp.net Core中實(shí)現(xiàn)自定義身份認(rèn)證的示例代碼

    這篇文章主要介紹了Asp.net Core中實(shí)現(xiàn)自定義身份認(rèn)證的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • ASP.NET表單驗(yàn)證方法詳解

    ASP.NET表單驗(yàn)證方法詳解

    在表單提交的時(shí)候,經(jīng)常需要對(duì)錄入信息的長(zhǎng)度、格式、內(nèi)容等進(jìn)行驗(yàn)證,以便獲得合理的信息。在ASP.NET開(kāi)發(fā)中主要的驗(yàn)證方法,我總結(jié)了一下,主要有一下幾種,如有不足之處請(qǐng)朋友們予以指出。
    2008-09-09
  • 使用源鏈接對(duì)ASP.NET Core源代碼進(jìn)行調(diào)試

    使用源鏈接對(duì)ASP.NET Core源代碼進(jìn)行調(diào)試

    這篇文章介紹了使用源鏈接對(duì)ASP.NET Core源代碼進(jìn)行調(diào)試的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • 從ASP.NET得到Microsoft Word文檔的代碼

    從ASP.NET得到Microsoft Word文檔的代碼

    這篇文章是應(yīng)在一個(gè)ASP.NET項(xiàng)目中建立Microsoft Word文檔的需要而寫的。本文描述了怎樣使用ASP.NET來(lái)創(chuàng)建和修改Microsoft Word文檔。
    2011-06-06
  • 利用ASP.NET MVC+Bootstrap搭建個(gè)人博客之打造清新分頁(yè)Helper(三)

    利用ASP.NET MVC+Bootstrap搭建個(gè)人博客之打造清新分頁(yè)Helper(三)

    這篇文章主要介紹了利用ASP.NET MVC+Bootstrap搭建個(gè)人博客之打造清新分頁(yè)Helper(三)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • asp.net web大文件上傳帶進(jìn)度條實(shí)例代碼

    asp.net web大文件上傳帶進(jìn)度條實(shí)例代碼

    web 大文件上傳 帶進(jìn)度條
    2008-10-10
  • Asp.net Mvc表單驗(yàn)證氣泡提示效果

    Asp.net Mvc表單驗(yàn)證氣泡提示效果

    這篇文章主要為大家詳細(xì)介紹了Asp.net Mvc表單驗(yàn)證氣泡提示效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • ASP.NET中GridView、DataList、DataGrid三個(gè)數(shù)據(jù)控件foreach遍歷用法示例

    ASP.NET中GridView、DataList、DataGrid三個(gè)數(shù)據(jù)控件foreach遍歷用法示例

    這篇文章主要介紹了ASP.NET中GridView、DataList、DataGrid三個(gè)數(shù)據(jù)控件foreach遍歷用法,結(jié)合實(shí)例形式分析了GridView、DataList、DataGrid使用foreach及for語(yǔ)句進(jìn)行數(shù)據(jù)遍歷的具體使用方法,需要的朋友可以參考下
    2016-08-08
  • Visual Studio 2010崩潰重啟問(wèn)題(源文件編譯崩潰)

    Visual Studio 2010崩潰重啟問(wèn)題(源文件編譯崩潰)

    在使用Visual Studio 2010突然出現(xiàn)崩潰現(xiàn)象:源文件修改只要一編譯,馬上就崩潰.搜索了很多的方法也不見(jiàn)效果,經(jīng)過(guò)近1天的折騰,已經(jīng)決定重裝Windows 7了,遇到此問(wèn)題的朋友們可以看看哦,或許對(duì)你有所幫助
    2013-01-01
  • asp.net 表單驗(yàn)證新思路

    asp.net 表單驗(yàn)證新思路

    產(chǎn)生環(huán)境:我們編程時(shí),常常會(huì)碰到很多表單,有的表單,項(xiàng)目超多,我做過(guò)最長(zhǎng)的有80多項(xiàng),眼睛真的是看得發(fā)痛。于是想出這樣一個(gè)偷懶的辦法。
    2010-02-02

最新評(píng)論