Asp.net-Mvc
ASP.NET MVC:通過動作使瀏覽器記憶體圖像
我有一個返回 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 動作方法)