ASP.NET MVC3的一個OutputCache問題

在 ASP.NET MVC 3 中如果使用了 OutputCache,一定要在 Action 中添加下面的代碼,切記!

Response.Cache.SetOmitVaryStar(true);

這是一個伴隨ASP.NET從1.0到4.0的OutputCache Bug,ASP.NET MVC 3 是基於 ASP.NET 4.0 的,所以也躲不過。


問題演示

下面先來體驗一下不加 Response.Cache.SetOmitVaryStar(true); 的情況。

示例Action代碼:

[OutputCache(Duration = 120)]
public ActionResult SiteHome(int? pageIndex)
{   
     ...
}

注:OutputCache.Location的默認值是OutputCacheLocation.Any(服務端、客戶端、代理服務器端等都進行緩存)

第一次請求:


第二次請求(F5刷新瀏覽器):


第三次請求(F5刷新瀏覽器):


接着第四次請求會返回304,第五次請求又返回200。。。

再體驗一下加 Response.Cache.SetOmitVaryStar(true); 的情況。

[OutputCache(Duration = 120)] 
public ActionResult SiteHome(int? pageIndex) 
{ 
    Response.Cache.SetOmitVaryStar(true); 
    ... 
}


第一次請求:

第二次請求(F5刷新瀏覽器):


第三次請求(F5刷新瀏覽器):


注:只要在緩存有效期內,服務器一直返回304。

問題分析

1. 200與304的區別

當返回狀態碼是200時,服務器端會將當前請求的整個頁面全部發送給客戶端(消耗下行帶寬)。

當返回狀態碼是304時,由於客戶端瀏覽器提供的 Last-Modified 時間在服務器端的緩存有效期內,服務器端只發送這個狀態碼,不發送頁面的任何內容(幾乎不消耗下行帶寬),瀏覽器直接從本地緩存中獲取內容。

所以,304的好處就是節約帶寬,響應速度更快。

2. 對服務端緩存的影響

加不加 Response.Cache.SetOmitVaryStar(true),服務端的緩存情況都是一樣的。只是不加 SetOmitVaryStar(true) 時,對於同一個客戶端瀏覽器,每隔一次請求,服務器端就不管客戶端瀏覽器的緩存,重新發送頁面內容,但是只要在緩存有效期內,內容還是從服務器端緩存中讀取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章