FileContentResult - 防止浏览器缓存图像

3

我正在从一个动作方法返回一张图片(png),我希望阻止浏览器缓存这张图片。

return File(reply, "image/png", "{0}_Graph".FormatWith(ciName));

我尝试了所有通常的方法,将不同头信息的数组附加到文件输出响应中,但似乎都没有对我起作用。
基本上,我的操作方法返回在服务器上生成的图表,可能会随时有所不同。我在客户端使用JavaScript的Image对象,并将其src设置为我的操作方法。
var image = new Image();
image.src = baseUrl + params;

每次请求相同的URL时,不会触发服务器处理。
我可以在查询字符串中添加一个随机数等,但我想知道是否有更好的方法。
2个回答

1

您可以设置适当的HTTP头来防止缓存(我不知道如何在ASP.NET中实现,但我想应该是类似于HTTP.Response.setHeader("foo", "bar")):

"Pragma-directive: no-cache"
"Cache-directive: no-cache"
"Cache-control: no-cache"
"Pragma: no-cache"
"Expires: 0"

如果您不喜欢随机数解决方案,可以使用当前时间戳:

image.src = baseUrl + params + '&t=' + new Date().getTime();

应该是 image.src = baseUrl + params + "&ts=" + new Date().getTime(); 如果省略 & 符号的话,时间值将会添加到查询字符串中的最后一个值。 - epascarello

1

由于这是MVC,使用MVC OutputCache属性。请参见我的回复: 禁用整个ASP.NET网站的浏览器缓存

还要记得在尝试此操作之前清除缓存。如果已经缓存,则结果可能不一致。


谢谢Adam。我正在使用OutputCache属性,就像你建议的那样,但是在图像src中对相同操作方法的调用仍然没有命中服务器。第一个请求可以正常到达服务器,只是第一个请求之后的所有请求都无法到达服务器。 - Jamie Dixon
你的浏览器设置怎么样?用的是哪个浏览器?IE?你设置为每次请求都获取新文件还是“自动”?有时IE会有问题。加载 fool fiddler 看看请求是否出现。如果没有 - 那就是IE(或其他浏览器)。还要检查应该在请求中发送的无缓存标头。你使用的是哪个版本的浏览器? - Adam Tuliper
我正在 FF6 中进行测试。我会检查你提到的事情。 - Jamie Dixon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接