10

我对 Chrome 有这个奇怪的问题。它经常出现缓存 PUT 请求。

详细信息:我有一个使用backbone.js 的应用程序,当尝试对模型进行一些更改时(骨干网自动生成一个PUT 请求),Chrome 只是不会将该请求发送到服务器。它在 Firefox 和 IE 中运行良好(到目前为止还没有在 Safari 中看到这个问题)。

这是 Chrome 开发人员工具的网络选项卡的屏幕截图。如您所见,PUT 请求的响应正在从缓存中返回(请求没有命中服务器!!) Chrome 缓存 PUT 请求

这是同一请求的标头详细信息的屏幕截图。再一次,很明显 Chrome 不会费心向服务器发送 PUT 请求。 Chrome 缓存的 PUT 请求标头

请求的有效负载是 JSON 数据。关于为什么会发生这种情况/我做错了什么的任何想法?

更新: Chromium 已经确认这确实是一个错误(感谢 Jan Hančič)。

临时解决方案 我最终覆盖了Backbone.sync方法并将时间戳附加到 PUT、POST 和 DELETE 请求的查询字符串中,以便它们始终是唯一的:

if(!options.data && model && (method == 'create' || method == 'update' || method == 'delete')) {
    params.url += (params.url.indexOf('?') == -1 ? '?' : '&') + '_=' + new Date().getTime();
}
4

2 回答 2

4

我使用额外的参数来避免缓存:

url += '?_dc=' + Math.random().toFixed(20).replace('.', '');

我不在服务器端解释这个参数。

编辑:除了 chrome 之外,还有很多东西可以缓存请求——例如用户的代理服务器。我认为附加查询参数是避免缓存的好方法。

于 2012-08-01T07:25:26.143 回答
0

Backbone 使用 jQuery 或 Zepto 发出 AJAX 请求。假设您使用的是 jQuery,请关闭缓存。

运行此命令以在整个应用程序中关闭缓存,这样您就不必担心缓存:

$.ajaxSetup({
      cache : false
});

如果保持缓存对您的业务很重要,我认为您可以对特定的无缓存调用执行以下操作:

model.save({}, {cache:false});
于 2012-08-01T14:11:54.037 回答