Asp.net-Mvc

ASP.NET MVC:通過動作使瀏覽器記憶體圖像

  • January 31, 2012

我有一個返回 File 並且只有一個參數(一個 id)的 actionmethod。

例如

public ActionResult Icon(long id)
{
   return File(Server.MapPath("~/Content/Images/image" + id + ".png"), "image/png");
}

我希望瀏覽器在我第一次訪問它時自動記憶體這個圖像,這樣下次它就不必下載所有數據了。

我嘗試過使用 OutputCacheAttribute 之類的東西,並在響應中手動設置標頭。IE:

[OutputCache(Duration = 360000)]

要麼

Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(Cache.NoAbsoluteExpiration); 

但是每次我在瀏覽器上按 F5 時,圖像仍然會載入(我正在 Chrome 和 IE 上嘗試)。(我知道它每次都會載入,因為如果我更改圖像,它也會在瀏覽器中更改)。

我看到 HTTP 響應有一些顯然應該工作的標頭:

記憶體控制:公共,最大年齡=360000

內容長度:39317

內容類型:圖片/png

日期:格林威治標準時間 2012 年 1 月 31 日星期二 23:20:57

過期:星期日,2012 年 2 月 5 日 03:20:56 GMT

最後修改時間:2012 年 1 月 31 日星期二 23:20:56 GMT

但是請求頭有這個:

Pragma:無記憶體

關於如何做到這一點的任何想法?

非常感謝

首先要注意的是,當您在 Chrome、Safari 或 IE 中按 F5(刷新)時,將再次請求圖像,即使它們已被記憶體在瀏覽器中。

要告訴瀏覽器它不需要再次下載圖像,您需要返回沒有內容的 304 響應,如下所示。

Response.StatusCode = 304;
Response.StatusDescription = "Not Modified";
Response.AddHeader("Content-Length", "0");

不過,您需要在返回 304 響應之前檢查 If-Modified-Since 請求標頭。因此,您需要根據圖像資源的修改日期檢查 If-Modified-Since 日期(無論是來自文件還是儲存在數據庫中等)。如果文件沒有更改,則返回 304,否則返回圖像(資源)。

這裡有一些很好的例子來實現這個功能(這些是針對 HttpHandler 的,但是同樣的原理也可以應用於 MVC 動作方法)

引用自:https://stackoverflow.com/questions/9088637