asp.net-mvc - ASP.NET MVC : Make browser cache images from action

标签 asp.net-mvc http caching

我有一个返回文件并且只有一个参数(一个 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/

相关文章:

asp.net - 重定向不适用于移动 View asp.net

c# - 我想过滤选择列表。我希望下拉菜单仅显示与预定类(class)注册同一类(class)的学生

javascript - 如何处理环回传入的 http 请求

ios - iOS 是否存储 DNS,如果存储,我如何在服务器传输后重置它?

c# - 遍历 ICollection 返回一个 bool

.net - jQuery Ajax - 针对 ASP.NET MVC 运行多个请求

linux - Nginx 配置添加 www 忽略请求 uri

http - PUT URL 是否真的需要指定资源

caching - 在哪一层实现缓存?

c - 缓存提供的空间局部性是指虚拟内存、物理内存还是两者兼而有之?