例如
public ActionResult Icon(long id) { return File(Server.MapPath("~/Content/Images/image" + id + ".png"),"image/png"); }
我希望浏览器在第一次访问它时自动缓存此图像,所以下次不必下载所有数据。
我已经尝试使用像OutputCacheAttribute这样的东西,并在响应上手动设置标题。即:
[OutputCache(Duration = 360000)]
要么
Response.Cache.SetCacheability(HttpCacheability.Public); Response.Cache.SetExpires(Cache.NoAbsoluteExpiration);
但是,每当我在浏览器上点击F5时,图像仍然会被加载(我正在Chrome和IE上尝试)。 (我知道每次都加载,因为如果我更改图像,它也会在浏览器中更改)。
我看到HTTP响应有一些明显应该起作用的头文件:
Cache-Control:public,max-age = 360000
内容长度:39317
Content-Type:image / png
日期:星期二,2012年1月31日23:20:57 GMT
过期日期:2012年02月05日03:20:56 GMT
最后修改:星期二,2012年1月31日23:20:56 GMT
但是请求头有这样的:
Pragma:无缓存
任何想法如何做到这一点?
非常感谢
解决方法
要告诉浏览器它不需要再次下载图像,您将需要返回一个没有内容的304响应,如下所示。
Response.StatusCode = 304; Response.StatusDescription = "Not Modified"; response.addheader("Content-Length","0");
在返回304响应之前,您需要检查If-Modified-Since请求头。因此,您需要根据图像资源的修改日期(无论是来自文件还是存储在数据库中),检查If-Modified-Since日期。如果文件没有改变,那么返回304,否则返回图像(资源)。
以下是实现此功能的一些很好的例子(这些对于HttpHandler而言,但是相同的原理可以应用于MVC操作方法)
> Make your browser cache the output of a httphandler
> HTTP Handler implementing dynamic resource caching
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。