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('.', '');

サーバー側ではこのパラメーターを解釈しません。

編集:クロム以外にも、リクエストをキャッシュできるものがたくさんあります-たとえば、ユーザーのプロキシサーバー。クエリ パラメータを追加することは、キャッシュを回避するための良い解決策だと思います。

于 2012-08-01T07:25:26.143 に答える
0

バックボーンは、jQuery または Zepto を使用して AJAX リクエストを作成します。jQuery を使用していると仮定して、キャッシュをオフに設定します。

これを実行して、アプリケーション全体でキャッシュをオフに設定し、キャッシュについて心配する必要がないようにします。

$.ajaxSetup({
      cache : false
});

あなたのビジネスにとってキャッシュをオンにしておくことが重要な場合は、特定のキャッシュなし呼び出しに対して次のようなことができると思います。

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