0

我有一個控制器,它返回SVG images.As我想有良好的表現,我決定使用緩存HTTP緩存如何在asp mvc中工作4

根據我在網上閱讀的內容,一旦您將最後修改日期設置爲HttpContext.Response.Cache.SetLastModified(date) ,您可以使用HttpContext.Request.Headers.Get("If-Modified-Since")從瀏覽器中請求它。比較兩個日期。如果它們相等,則表示圖像未被修改,因此您可以返回HttpStatusCodeResult(304, "Not Modified")

但奇怪的事情發生了,這裏是我的代碼:

[OutputCache(Duration = 60, Location = OutputCacheLocation.Any, VaryByParam = "id")] 
    public ActionResult GetSVGResources(string id) 
    { 

     DateTime lastModifiedDate = Assembly.GetAssembly(typeof(Resources)).GetLinkerTime(); 

     string rawIfModifiedSince = HttpContext.Request.Headers.Get("If-Modified-Since"); 

     if (string.IsNullOrEmpty(rawIfModifiedSince)) 
     { 
      // Set Last Modified time 
      HttpContext.Response.Cache.SetLastModified(lastModifiedDate); 
     } 
     else 
     { 
      DateTime ifModifiedSince = DateTime.Parse(rawIfModifiedSince); 

      if (DateTime.Compare(lastModifiedDate, ifModifiedSince) == 0) 
      { 
       // The requested file has not changed 
       return new HttpStatusCodeResult(304, "Not Modified"); 
      } 

     } 

     if (!id.Equals("null")) 
      return new FileContentResult(Resources.getsvg(id), "image/svg+xml"); 
     else 
      return null; 
    } 

正在發生的事情是功能 HttpContext.Response.Cache.SetLastModified(lastModifiedDate);不設置「如果-Modified-Since的」從瀏覽器返回時,事實上的功能HttpContext.Request.Headers.Get("If-Modified-Since")正好回退圖像從前一個呼叫return new FileContentResult(Resources.getsvg(id), "image/svg+xml");返回的時間。

所以我的問題是,

1 - 什麼是設置的功能HttpContext.Response.Cache.SetLastModified(lastModifiedDate)到底是什麼?

2 - 我如何(服務器)設置瀏覽器的「If-Modified-Since」返回?

回答

0

看起來你似乎在混淆一堆相關但卻完全不同的概念。

OutputCache是服務器上基於內存的緩存。緩存某些內容意味着雖然它仍然存在於內存中並且尚未陳舊,但服務器可以放棄處理該操作,並剛剛返回之前已經呈現的響應。客戶根本沒有參與。

HTTP緩存是服務器和客戶端之間的交互。服務器發送一個響應頭部,指示資源何時上次更新。客戶端發送一個If-Modified-Since請求頭部,向服務器表明它沒有必要發送資源作爲響應的一部分,如果它沒有被修改的話。所有這些都可以節省一點帶寬。請求仍然存在,並且仍然收到響應,但是資源的實際數據(如SVG)不必沿管道傳輸。

然後,基本的基於瀏覽器的緩存與HTTP緩存協同工作,但沒有它也可以運行。瀏覽器只保存下載的每個資源的副本。如果仍有該副本,則不會再向服務器請求再次獲取該副本。在這種情況下,甚至可能不會提出請求。但是,瀏覽器也可能會發送一個包含該頭文件的請求,以查看它擁有的文件是否仍然「新鮮」。然後,如果它不再從服務器獲取文件,則只使用其保存的副本。

無論哪種方式,它都在客戶端上。客戶端可以配置爲永不緩存,在這種情況下,它總是會請求資源,無論它們是否已被修改,或者它可能被配置爲始終使用緩存,甚至從不打擾檢查資源是否已更新或不。

還有一些類似於代理的東西使得事情變得更加複雜,因爲代理充當客戶端,並且可能會選擇緩存或不隨意緩存,最終用戶的Web瀏覽器或其他客戶端甚至可以在此事。

所有歸結到的是你不能在服務器上設置If-Modified-Since,並且你無法控制客戶端是否在請求中發送它。涉及到涉及客戶的緩存形式時,您就是客戶的心血結晶。

+0

有趣的是,我不知道「outputcache」是否是服務器端基於內存的緩存。但是,如何檢查是否需要返回圖像?因爲「If-Modified-Since」的返回時間不是上次修改圖像的時間。 – coldistric