哪些浏览器在缓存XMLHTTPRequest响应时存在问题?

7

目前流行的浏览器中,是否有特定的问题会影响XMLHttpRequest响应的缓存?我需要注意什么?

我想在每个页面上包含XMLHttpRequest查询作为一种动态加载内容(如JSON)或与页面类型相关的行为(例如eval()JavaScript)的方法,但希望确保如果服务器发送了正确的标头,则可以缓存从服务器接收到的资源。

我担心阅读到这篇文章提到,像Firefox 1.1这样的浏览器不会缓存通过XMLHTTPRequest获取的任何内容,并且它总是请求完全发送新数据(使用Cache-Control和无If-Modified-Since),而不管服务器发送的标头。

显然,那篇文章非常古老 - 我甚至不记得Firefox 1.1; 那么我需要考虑当前流行的浏览器以及是否有任何技巧可以让我特别地希望响应被缓存吗?

为了澄清我的问题,我所指的缓存是客户端缓存,服务器发出新鲜度信息(以Cache-Control: max-age指令或Expires: header形式)并且浏览器将响应的副本存储在其缓存中,同时附带一个到期日期,这样从后续页面发出的相同资源的请求可以从浏览器缓存中满足,而无需与服务器进行任何联系。所有主要浏览器对大多数内容都能正确执行此操作,但我听说Firefox不能对XMLHttpRequest内容执行此操作。我的问题是,是否有人知道当使用XMLHttpRequest时,现代浏览器不按照规范缓存响应的情况。


最好且更加一致的方式是在你的JS中控制它。如果不需要刷新,就不要查询。 - Javier
你是什么意思?你能举个例子吗?我想要从服务器获取一些东西,但如果浏览器已经在缓存中保存了它,并且它没有过期,那么就不需要再向服务器发送请求。尽管如此,我仍然需要这些数据,不能不查询。 - thomasrutter
2个回答

11

Mark Nottingham提供了一组优秀的功能测试,展示浏览器XMLHttpRequest缓存行为。在您想要支持的浏览器中加载该页面,并确定哪些技术可以和哪些不能够被依赖以使您的响应被缓存。


非常感谢您。这看起来相当有前途,因为Firefox通过了那些“新鲜度”测试(包括所有带有“过期”的测试)。 - thomasrutter
3
脚本似乎不再起作用了。已在Chrome中进行测试。控制台上出现了许多安全警告。 - Kae Verens

4

虽然一些浏览器有不同的默认设置(默认情况下,IE会缓存来自AJAX请求的结果,但是Firefox默认情况下不会),但我所知道的所有浏览器都会遵守http头,例如Cache-Control。因此,请正确设置应用程序的缓存标头。

这里是一个例子:

    public ActionResult SomeAction()
    {
        var model = [...];
        Response.AddHeader("Cache-Control", "no-cache");
        return Json(model);
    }

现在IE和Firefox将会表现一致;它们都不会缓存操作的结果。

我不会那么肯定。IE6的缓存太过积极了。我已经被它咬了好几次了。如果你不想让查询被缓存,可以在URL中添加一个随机后缀(未使用的参数也可以)。 - Javier
不幸的是,这与我所需的相反 - 我想确保响应被缓存。也就是说,如果浏览器可以使用其缓存中尚未过期的先前响应满足请求,则希望它这样做,并且根本不需要向源服务器发出请求。 - thomasrutter
1
Javier,那样做是可行的,但它将缓存策略委托给客户端,我认为这不是正确的位置。 - Craig Stuntz
Thomas,我了解你的需求,但我不能为你设置策略。请阅读我包含的链接。查看公共和最大年龄值。 - Craig Stuntz
1
抱歉,我可能没有表达清楚。我完全了解HTTP规范,包括服务器指定新鲜度信息的所有方式。然而,并非所有的浏览器都遵守所有规定,我想知道是否有任何特别与XMLHTTPRequest有关的问题的浏览器。 - thomasrutter

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