亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Last-Modified、If-Modified-Since 實現緩存和 OutputCache 的區別

2019-11-17 02:02:52
字體:
來源:轉載
供稿:網友

Last-Modified、If-Modified-Since 實現緩存和 OutputCache 的區別

先梳理三個概念:

  • OutputCache:頁面輸出緩存,一般 asp.net 應用程序會用到。
  • Last-Modified:Http 響應頭(Http Reponse Header),由服務器發給客戶端,格式為 Last-Modified:Tue, 24 Mar 2015 06:40:46 GMT
  • If-Modified-Since:Http 請求頭(Http Request Header),由客戶端發給服務器,格式為 If-Modified-Since:Tue, 24 Mar 2015 06:40:46 GMT

還有兩個 HTTP 狀態碼:

  • 200(成功):正常狀態,服務器已成功處理了請求,每次都有客戶端和服務端的交互。
  • 304(未修改):自從上次請求后,請求的網頁未修改過,服務器返回此響應時,不會返回網頁內容。如果網頁自請求者上次請求后再也沒有更改過,將服務器配置為返回此響應(If-Modified-Since HTTP),服務器可以告訴客戶端網頁沒有變更,進而節省帶寬和開銷。

如果我們的應用程序沒有進行任何的緩存處理,客戶端在每次瀏覽頁面的時候,Last-Modified 和 If-Modified-Since 的響應值都為 NULL,并且 HTTP 狀態碼為 200,這沒什么問題。我們下面要做的工作先使用 OutputCache 實現緩存,代碼很簡單:

public static int index = 0;[OutputCache(Duration = 120)]public ActionResult About(){      FileHelper.Write(@"C:/Users/xishuai/Desktop/test.txt", (index+1).ToString());      ViewBag.Message = "Message:" + index++;      return View();}

第一次請求:

  • Status Code:200
  • Last-Modified:Tue, 24 Mar 2015 07:13:46 GMT
  • If-Modified-Since:NULL
  • test.txt:0
  • Message:0

第二次請求:

  • Status Code:304
  • Last-Modified:Tue, 24 Mar 2015 07:13:46 GMT
  • If-Modified-Since:Tue, 24 Mar 2015 07:13:46 GMT
  • test.txt:0
  • Message:0

第三次請求:

  • Status Code:304
  • Last-Modified:Tue, 24 Mar 2015 07:13:46 GMT
  • If-Modified-Since:Tue, 24 Mar 2015 07:13:46 GMT
  • test.txt:0
  • Message:0

Message 和 test.txt 里面的值一直為 0,Message 是為了測試頁面緩存有沒有生效,test.txt 是為了測試 About Action 有沒有執行,這兩個值的測試結果是我們想要的。另外,可以看到,第一次刷新的時候,Last-Modified 是有值的,而 If-Modified-Since 卻沒有值,這是因為 Last-Modified 是服務器發給客戶端,而 If-Modified-Since 的產生必須要要通過 Last-Modified,并且是由客戶端發給服務器,這個在第二次刷新的時候就可以看到,在頁面輸出緩存的 120 秒內,這兩個值會一直不變。

dudu 之前的兩篇博文:

  • 一個伴隨 ASP.NET 從 1.0 到 4.0 的 OutputCache Bug
  • 注意!ASP.NET MVC 3 的一個 OutputCache 問題

出現的問題就是我們在第三次請求的時候,HTTP 狀態碼為 200,之前的解決方式是 Response.Cache.SetOmitVaryStar(true);,這個我在做測試的時候沒有遇到,使用的是 MVC 5.2.2,微軟應該是修復了。


上面是 ASP.NET 中使用 OutputCache 進行緩存的處理,我們一般也是這么用的,根據對 Last-Modified 和 If-Modified-Since 的理解,我們能不能使用它們,來實現 OutputCache 的一些效果呢?下面我們來嘗試下,簡單代碼:

public static int index = 0;public ActionResult About(){    string dt = Request.Headers["If-Modified-Since"];    DateTime isModifiedSince;    if (!string.IsNullOrEmpty(dt))    {        if (DateTime.TryParse(dt, out isModifiedSince))        {            if (isModifiedSince.AddSeconds(120) < DateTime.Now)            {                Response.Cache.SetLastModified(DateTime.Now);            }        }    }    else    {        Response.Cache.SetLastModified(DateTime.Now);    }    FileHelper.Write(@"C:/Users/xishuai/Desktop/test.txt", (index+1).ToString());    ViewBag.Message = "Message:" + index++;    return View();}

先說下上面代碼的意思,首先獲取請求頭中 If-Modified-Since 的值,如果沒有值的話,就通過 SetLastModified 設置響應頭中 Last-Modified 的值,如果有值的話,進行時間間隔判斷,如果在 120 秒之外,則更新 Last-Modified 的值,否則不更新,我們來看下測試結果。

第一次請求:

  • Status Code:200
  • Last-Modified:Tue, 24 Mar 2015 07:34:58 GMT
  • If-Modified-Since:NULL
  • test.txt:0
  • Message:0

第二次請求:

  • Status Code:200
  • Last-Modified:NULL
  • If-Modified-Since:Tue, 24 Mar 2015 07:35:46 GMT
  • test.txt:1
  • Message:1

第三次請求:

  • Status Code:200
  • Last-Modified:Tue, 24 Mar 2015 07:36:03 GMT
  • If-Modified-Since:NULL
  • test.txt:2
  • Message:2

這是什么情況?和 OutputCache 的效果也差太多了吧,總的來說,HTTP 的狀態碼一直為 200,test.txt 和 Message 的值一直在發生變化,也就是說“緩存”沒有一點效果,而 Last-Modified 和 If-Modified-Since 則更奇怪,一會有值,一會沒值。其實很正常,如果 HTTP 的狀態碼為 200,當一個請求發起的時候,首先設置 Last-Modified 的值,而 If-Modified-Since 則是在下個請求才能生效,因為生效了,所以第二次請求的時候,我們并沒有設置 Last-Modified 的值,所以第一次和第二次的請求結果就是上面所示,下面的請求就是重復第一次和第二次請求。

我們知道,Last-Modified 和 If-Modified-Since 的結果和 HTTP 的狀態碼有關,下面我們再來修改下代碼:

public static int index = 0;public ActionResult About(){    string dt = Request.Headers["If-Modified-Since"];    DateTime isModifiedSince;    if (!string.IsNullOrEmpty(dt))    {        if (DateTime.TryParse(dt, out isModifiedSince))        {            if (isModifiedSince.AddSeconds(120) < DateTime.Now)            {                Response.Cache.SetLastModified(DateTime.Now);                Response.StatusCode = 200;            }            else            {                Response.StatusCode = 304;            }        }        else        {             Response.StatusCode = 304;         }    }    else    {        Response.Cache.SetLastModified(DateTime.Now);        Response.StatusCode = 200;    }    FileHelper.Write(@"C:/Users/xishuai/Desktop/test.txt", (index+1).ToString());    ViewBag.Message = "Message:" + index++;    return View();}

你可以看到我們想要做的目的吧,就是手動設置 HTTP 狀態碼,我們來看下測試結果。

第一次請求:

  • Status Code:200
  • Last-Modified:Tue, 24 Mar 2015 07:49:07 GMT
  • If-Modified-Since:NULL
  • test.txt:0
  • Message:0

第二次請求:

  • Status Code:304
  • Last-Modified:NULL
  • If-Modified-Since:Tue, 24 Mar 2015 07:49:07 GMT
  • test.txt:1
  • Message:0

第三次請求:

  • Status Code:304
  • Last-Modified:NULL
  • If-Modified-Since:Tue, 24 Mar 2015 07:49:07 GMT
  • test.txt:2
  • Message:0

說實話,就差一點和 OutputCache 的效果一樣,那差的是什么呢?其實就是 test.txt 里的值,在使用 OutputCache 的時候,這里面的值是不變的,也就是說 About Action 沒有被執行,而我們上面測試顯示,About Action 是執行的,對于 Message 來說,瀏覽器顯示的是緩存后的值,我們可以得出這樣的結論:當使用 OutputCache 的時候,客戶端只是向服務器發起一個 Request,僅此而已,這個我們在 application_BeginRequest 事件中監控到,其余的頁面顯示完全是客戶端緩存的結果,當然,前提方式緩存方式是客戶端。

還有一個有意思的地方是,在使用 OutputCache 的時候,除了第一次請求外,其他請求結果中,Last-Modified 和 If-Modified-Since 的值是不變的,根據上面測試的結果,我們可以得出,If-Modified-Since 是 Last-Modified 設置之后的結果,If-Modified-Since 可以一直不變,只要 HTTP 狀態碼為 304,并且我們沒有對 Last-Modified 進行設置。而在使用 OutputCache 的時候,除了 If-Modified-Since 的值一直沒變,Last-Modified 的也一直沒變,這個有點詭異,應該是把請求和響應頭中的值也進行了緩存。

參考資料:

  • 影響Cache的幾個HTTP頭信息
  • 有關Last-Modified 與 If-Modified-Since
  • HTTP的請求頭標簽 If-Modified-Since
  • Last-Modified Header in MVC

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品免费观看| 国产精品夜色7777狼人| 国产91精品久久久| 欧美激情在线观看视频| www.日韩不卡电影av| 另类专区欧美制服同性| 国产亚洲一区精品| 日本久久亚洲电影| 日本精品视频在线| 成人a级免费视频| 国产精品亚洲综合天堂夜夜| 欧美日韩国产第一页| 日韩精品欧美国产精品忘忧草| 日韩精品中文字幕视频在线| 久久国产精品视频| 另类图片亚洲另类| 国产婷婷成人久久av免费高清| 欧美视频在线免费| 亚洲аv电影天堂网| 人妖精品videosex性欧美| 国产91精品久久久久久| 久久久噜噜噜久久久| 夜夜嗨av色综合久久久综合网| 日韩av综合网| 亚洲桃花岛网站| 97涩涩爰在线观看亚洲| 欧美制服第一页| 久久久久久久国产| 久热精品视频在线观看| 国产亚洲日本欧美韩国| 久久国产视频网站| 日韩欧美高清在线视频| 亚洲毛片在线观看| 欧美性极品xxxx做受| 亚洲国产精品福利| 欧美国产日韩一区二区在线观看| 亚洲第一av在线| 欧美性猛交99久久久久99按摩| 日韩精品视频在线观看网址| 日韩久久精品电影| 成人免费福利在线| 亚洲成人久久久| 欧美成人自拍视频| 欧美美女操人视频| 国产日韩欧美电影在线观看| 欧美高清视频在线| 国产精品久久久久久久久免费| 国产精品免费在线免费| 国产精品一区专区欧美日韩| 欧美激情视频一区二区三区不卡| 国产精品美女999| 久久久久日韩精品久久久男男| 亚洲欧美日韩国产精品| 国产精品成人观看视频国产奇米| 成人av番号网| 久久久久久亚洲精品中文字幕| 亚洲国模精品私拍| 国产在线拍揄自揄视频不卡99| 96pao国产成视频永久免费| 亚洲久久久久久久久久| 亚洲成人黄色在线观看| xxxxx成人.com| 久久久久久久久久久国产| 中文字幕久热精品视频在线| 国产精品1区2区在线观看| 国产又爽又黄的激情精品视频| 91香蕉国产在线观看| 国产一区二区三区高清在线观看| 亚洲变态欧美另类捆绑| 韩日欧美一区二区| 久久精品91久久香蕉加勒比| 欧美超级免费视 在线| 国产精品永久免费视频| 国产日韩在线精品av| 91丝袜美腿美女视频网站| 国产精品久久久| 亚洲免费人成在线视频观看| 欧美日韩在线影院| 久久全球大尺度高清视频| 亚洲精品免费一区二区三区| 久久成人亚洲精品| 91高潮在线观看| 久久综合久中文字幕青草| 国产精品久久久久久久久| 国产精品第8页| 亚洲精品国产成人| 欧美在线不卡区| 国产97人人超碰caoprom| 91性高湖久久久久久久久_久久99| www.色综合| 亚洲成年人影院在线| 亚洲欧洲第一视频| 中文字幕精品久久| 精品无码久久久久久国产| 日韩av免费看| 国产精品亚洲精品| 国产精品九九九| 97成人在线视频| 91久久精品日日躁夜夜躁国产| 懂色aⅴ精品一区二区三区蜜月| 欧美国产极速在线| 成人国产亚洲精品a区天堂华泰| 欧美肥臀大乳一区二区免费视频| 国产精品影院在线观看| 亚洲国产精品va在看黑人| 色综合天天狠天天透天天伊人| 国内精品在线一区| 欧美性生交xxxxxdddd| 69av成年福利视频| 国产亚洲在线播放| 国产亚洲一区二区在线| 国产精品久久久久久久av大片| **欧美日韩vr在线| 亚洲人成网7777777国产| 日韩免费观看网站| 亚洲理论片在线观看| 欧美国产高跟鞋裸体秀xxxhd| 亚洲国产精品va| 欧美一级视频免费在线观看| 岛国av在线不卡| 国产精品午夜视频| 国产精品九九久久久久久久| 日韩av在线免费看| 国产伦精品免费视频| 亚洲天堂av在线播放| 日韩欧美成人区| 亚洲精品中文字| 国产精品青青在线观看爽香蕉| 亚洲精品视频中文字幕| 欧美国产精品日韩| 欧美激情网友自拍| 欧美黑人xxx| 亚洲最大成人免费视频| 91国产一区在线| 亚洲一区二区福利| 国产成人高潮免费观看精品| 色偷偷偷综合中文字幕;dd| 98视频在线噜噜噜国产| 日韩精品免费视频| 国产ts一区二区| 秋霞成人午夜鲁丝一区二区三区| 高清日韩电视剧大全免费播放在线观看| 国产精品久久精品| 国产精品视频区1| 欧美在线观看一区二区三区| 精品丝袜一区二区三区| 中日韩美女免费视频网址在线观看| 亚洲天堂免费视频| 97国产在线视频| 亚洲色图综合久久| 亚洲人成在线一二| 欧美午夜精品伦理| 亚洲人成欧美中文字幕| 亚洲片国产一区一级在线观看| 日韩在线欧美在线| 亚洲视频在线观看| 性欧美xxxx视频在线观看| 国产精品久久久久久av福利软件| 国产+成+人+亚洲欧洲| 国模私拍视频一区| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲欧美中文在线视频| 伊人青青综合网站| 日韩欧美a级成人黄色|