加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC:使浏览器缓存图像从动作

发布时间:2020-12-15 18:46:40 所属栏目:asp.Net 来源:网络整理
导读:我有一个action方法返回一个文件,只有一个参数(一个id)。 例如 public ActionResult Icon(long id){ return File(Server.MapPath("~/Content/Images/image" + id + ".png"),"image/png");} 我希望浏览器在第一次访问它时自动缓存此图像,所以下次不必下载所
我有一个action方法返回一个文件,只有一个参数(一个id)。

例如

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:无缓存

任何想法如何做到这一点?

非常感谢

解决方法

首先要注意的是,当您在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操作方法)

> Make your browser cache the output of a httphandler
> HTTP Handler implementing dynamic resource caching

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读