如何强制客户端浏览器从服务器下载图像而不是使用其缓存

时间:2010-05-20 09:10:48

标签: asp.net http browser caching http-headers

假设一个简单的aspx数据输入页面,管理员用户可以在其中上传图像以及其他一些数据。它们存储在数据库中,下次管理员访问该页面以编辑记录,获取图像数据并生成预览并保存到磁盘(使用GDI +),预览显示在图像控件中。

此过程首次正常工作,但如果图像更改(上传新图片),则下次浏览页面时,它会显示以前上传的图片。我调试了应用程序,一切正常。新图像数据在数据库中,新预览存储在Temp位置,但页面显示前一个。如果我刷新页面,它会显示新的图像预览。我应该提一下,预览总是保存到磁盘上,并带有一个名称(每个记录的id作为名称)。

我认为这是因为IE和其他浏览器使用客户端缓存而不是每次浏览页面时加载图像。我想知道是否有办法强制客户端浏览器刷新自己,以便在没有用户干预的情况下显示新上传的图像。

提前感谢和赞赏,

2 个答案:

答案 0 :(得分:3)

最简单的方法是让您的应用程序在每次上传新图像时更改图像的文件名。

或许可以在图像文件名末尾添加日期,日期和时间。

或者,您可以尝试在HTML标头中设置缓存控件:<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">

答案 1 :(得分:0)

The HTTP Spec包含用于向客户端传达有关资源“可缓存性”信息的各种标头。维基百科也有一个很好的总结here

基本上,当服务器向客户端提供一些资源时,它会附带各种元数据。基于此元数据,客户端决定是否缓存资源,如果是,则确定是否存在多长时间。

您可以通过各种方式解决问题。最简单的方法可能是始终将图像响应的Expires标题设置为1970年1月1日(Unix Epoch)的值。这将告诉客户端在1970年使缓存条目到期。由于它始终在1970年以后,客户端将永远不会缓存资源并始终请求新的副本。

这种方法确实有它的缺点,即如果图像永远不会改变,你就会不必要地在服务器上产生额外的带宽和负载。这就是ETag和LastModified标头的用武之地。

服务器可以为每个资源计算短哈希值。假设一个图像的哈希值为a423fedc。客户端将存储此哈希,并在第二次请求资源时,使用If-None-Match请求标头将其提供给服务器。如果服务器计算出该资源的ETag未更改,它将只返回304 Not Modified,客户端可以使用缓存版本。 ETag将进一步解释here

但我认为你的最佳解决方案是Last-Modified标题。服务器将发送与上次修改映像相对应的日期。重新加载页面后,客户端会将此同一日期作为If-Modified-Since标题的一部分发回。如果自该日期以来图像已被修改,则服务器将发送更新的图像。如果没有,它会发回304 Not Modified代码。

我不是ASP开发人员,因此我无法告诉您如何在响应中设置这些标头,但如果您能弄清楚如何,每个Web浏览器都会正确执行缓存。我确实找到this article,看起来它可以告诉你如何在ASP-land中这样做,但只要知道标题应该足以让你开始。

对于调试,使用Firebug插件使用Firefox等浏览器进行测试是一个好主意。它可以显示您的请求和响应的标题,因此您可以知道实际通过网络传输的内容。如果您使用的是缓存版本,或者服务器没有返回新数据,您实际上会在Firebug中看到304响应,这可能很有用。