The HTTP Spec包含用于传达关于资源的“可缓存”,以客户的各种信息标题。维基百科也有一个很好的总结here。
基本上,当一台服务器向客户端传递一些资源时,它会附带各种元数据。基于这个元数据,客户决定是否缓存资源,如果是,缓存多久。
你可以用各种方式解决你的问题。最简单的方法可能是始终将图像响应中的Expires
标题设置为1970年1月1日的值(Unix Epoch)。这将告诉客户端在1970年过期缓存条目。由于它总是在1970年以后,客户端永远不会缓存资源并且总是要求一个新的副本。
这种方法确实有其不足之处,即如果图像永不改变,您不必要地承担额外的带宽和服务器上的负载。这就是ETag和LastModified标头进来的地方。
服务器可以计算每个资源的短散列。假设一个图像的哈希值为a423fedc
。客户端将存储此散列,并在第二次请求资源时,使用If-None-Match
请求标头将其提供给服务器。如果服务器计算出该资源的ETag未更改,则它只会发送一个304 Not Modified
,客户端可以使用该缓存版本。 ETags进一步解释here。
但我认为你的情况最好的解决方案是Last-Modified
标题。服务器将发送与上次修改图像相对应的日期。在重新加载页面后,客户端将此日期作为If-Modified-Since
标题的一部分发回。如果自该日期以后该图像已被修改,则服务器将发送更新的图像。如果没有,则发回304 Not Modified
代码。
我不是ASP开发人员,所以我不能告诉你如何在你的响应中设置这些标题,但如果你能弄明白,每个浏览器都会正确地进行缓存。我确实找到this article,看起来它可以告诉你如何在ASP-land中做到这一点,但只是知道标题应该足以让你开始。
对于调试,最好使用Firebug插件等Firefox浏览器进行测试。它可以向您显示您的请求和回复中的标题,以便您知道实际上正在通过的线路。如果您使用的是缓存版本,或者服务器没有返回新数据,您实际上会在Firebug中看到304响应,这很有用。
这些建议是否符合您的需求? – jasonmp85 2010-06-03 10:09:00