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

Asp.net 如何强制客户端浏览器从服务器下载图像,而不是使用其缓存,asp.net,http,browser,caching,http-headers,Asp.net,Http,Browser,Caching,Http Headers,假设有一个简单的aspx数据输入页面,管理员用户可以在其中上传图像和一些其他数据。它们存储在数据库中,下次管理员访问该页面编辑记录时,将获取图像数据,生成预览并保存到磁盘(使用GDI+),预览将显示在图像控件中 此过程第一次运行良好,但如果下次浏览页面时图像发生变化(上传新图像),则会显示先前上传的图像。我调试了应用程序,一切正常。新图像数据在数据库中,新预览存储在临时位置,但页面显示上一个。如果我刷新页面,它将显示新的图像预览。我应该提到,预览总是以一个名称(每个记录的id作为名称)保存到磁盘

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

此过程第一次运行良好,但如果下次浏览页面时图像发生变化(上传新图像),则会显示先前上传的图像。我调试了应用程序,一切正常。新图像数据在数据库中,新预览存储在临时位置,但页面显示上一个。如果我刷新页面,它将显示新的图像预览。我应该提到,预览总是以一个名称(每个记录的id作为名称)保存到磁盘上

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


提前感谢和感谢,

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

也许可以在图像文件名的末尾附加一个日期或日期和时间

或者,您可以尝试在HTML标题中设置缓存控件:

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

基本上,当服务器将一些资源交给客户机时,会附带各种元数据。基于此元数据,客户机决定是否缓存资源,如果是,缓存多长时间

你可以用各种方法解决你的问题。最简单的方法可能就是始终将图像响应上的
Expires
标题设置为1970年1月1日的值()。这将告诉客户端在1970年使缓存项过期。因为它总是超过1970年,所以客户端永远不会缓存资源,并且总是请求一个新副本

这种方法确实有它的缺点,即如果映像从未更改,您就不需要在服务器上产生额外的带宽和负载。这就是ETag和LastModified头的作用

服务器可以为每个资源计算一个短哈希。假设一个图像的散列结果是
a423fedc
。客户端将存储此散列,并且在第二次请求资源时,如果没有匹配的请求头,则使用
将其提供给服务器。如果服务器计算出该资源的ETag没有更改,它只会返回一个
304 Not Modified
,客户端可以使用缓存的版本。etag将进一步解释

但我认为最好的解决方案是上次修改的
标题。服务器将发送一个与上次修改图像的时间相对应的日期。在重新加载页面时,如果自
标题修改,则客户端将此日期作为
的一部分发回。如果自该日期起图像已被修改,服务器将发送更新的图像。如果未修改,则发回
304未修改
代码

我不是ASP开发人员,所以我无法告诉您如何在响应中设置这些标题,但如果您能找到方法,每个web浏览器都会正确地进行缓存。我确实发现它可以告诉你如何在ASP土地上做到这一点,但仅仅知道标题就足以让你开始


对于调试,最好使用该插件在Firefox等浏览器上进行测试。它可以向您显示请求和响应的标题,这样您就知道实际发生了什么。如果您使用的是缓存版本,或者服务器没有返回新数据,您将在Firebug中实际看到304响应,这可能很有用。

+1这种方法在过去对我很有效。特别是在发布带有新图像的站点的新版本时。我们在图片的url中包含了版本号。在您的情况下,您应该想出一种方法,在逐个图像的基础上增加一个版本。也许这是一个不错的字符串解析练习。一个警告是,css样式表中引用的任何图像都不能很好地使用这种方法,但在这种情况下,这不会影响您。请注意,@Gilbert的答案由两部分组成:更改文件名或设置缓存控制。我提倡第一部分,即更改文件名,而不是第二部分,“无缓存”,因为后者意味着您在不更改图像时将失去客户端缓存的好处。这些建议中的任何一个是否满足了您的需要?