我有一个返回文件并且只有一个参数(一个 id)的操作方法。
例如
public ActionResult Icon(long id)
{
return File(Server.MapPath("~/Content/Images/image" + id + ".png"), "image/png");
}
我希望浏览器在我第一次访问该图像时自动缓存它,这样下次它就不必下载所有数据。
我尝试过使用 OutputCacheAttribute 之类的东西并在响应中手动设置 header 。即:
[OutputCache(Duration = 360000)]
或
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(Cache.NoAbsoluteExpiration);
但是每次我在浏览器上按 F5 时图像仍然加载(我正在 Chrome 和 IE 上尝试)。 (我知道它每次都会加载,因为如果我更改图像,它也会在浏览器中更改)。
我看到 HTTP 响应有一些显然应该有效的 header :
Cache-Control:public, max-age=360000
Content-Length:39317
Content-Type:image/png
Date:Tue, 31 Jan 2012 23:20:57 GMT
Expires:Sun, 05 Feb 2012 03:20:56 GMT
Last-Modified:Tue, 31 Jan 2012 23:20:56 GMT
但是请求 header 是这样的:
Pragma:no-cache
知道如何做到这一点吗?
非常感谢
最佳答案
首先要注意的是,当您在 Chrome、Safari 或 IE 中按 F5(刷新)时,将再次请求图像,即使它们已缓存在浏览器中。
要告诉浏览器它不需要再次下载图像,您需要返回一个没有内容的 304 响应,如下所示。
Response.StatusCode = 304;
Response.StatusDescription = "Not Modified";
Response.AddHeader("Content-Length", "0");
不过,在返回 304 响应之前,您需要检查 If-Modified-Since 请求 header 。因此,您需要检查 If-Modified-Since 日期与图像资源的修改日期(无论是来自文件还是存储在数据库中等)。如果文件未更改则返回 304,否则返回图像(资源)。
这里有一些实现此功能的好例子(这些是针对 HttpHandler 但相同的原则可以应用于 MVC 操作方法)
关于asp.net-mvc - ASP.NET MVC : Make browser cache images from action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9088637/