0

私は特に高価な (クエリと帯域幅の点で) を扱っています。これはアイテムのカタログと考えてください。ただし、カタログは常に完全に正確である必要があります。つまり、カタログの更新はリアルタイムで反映される必要があるため、固定のキャッシュ有効期限は機能しません。

カタログは、現在、JQuery 1.8.2 を使用して、次のようにクライアントによって要求されています。

    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "http://myserver.com/somejsonquery.aspx",
        data: {},
        dataType: "json",
        success: function ( ... ) { ... },
        error: function ( ... ) { ... }
        });

結果は、"application/json" コンテンツ タイプで適切にフォーマットされた JSON になります。

私はサーバー側で信頼できるキャッシュを維持しているので、If-Modified-Since セマンティクスを実装して、キャッシュが最新のときに (DB またはネットワーク ヒットを発生させることなく) サーバーが 304 を返すことができるようにしたいと考えています。 「If-Modified-Since」タイムスタンプ以降にリロードが発生した場合、クライアントへの新しいカタログ。

ただし、これを機能させるのに問題があります(少なくともIEでは)。次の設定を試みましたが、クライアントに If-Modified-Since を送信させることができませんでした。

  • JSON リクエストで "cache: true" を設定します
  • サーバーが応答で "Cache-control: private" HTTP ヘッダーを返すようにする

これについて洞察を持っている人はいますか?

フォローアップとして、キャッシュ制御を「パブリック」に設定した場合 (つまり、プロキシ サーバーによってキャッシュ可能)、キャッシュの一貫性はプロキシを通じて維持されますか? つまり、クライアントがそのページを要求するたびに、プロキシがサーバーに戻ってチェックします。プロキシ キャッシングを有効にする場合、プロキシが一貫したキャッシュ状態を保証することを完全に確認する必要があります。

私はしばらくこれに固執していたので、助けていただければ幸いです!

ありがとう - K.

4

2 に答える 2

1

私はついにこれを理解することができました。次の変更を加える必要があることがわかりました。

クライアント側の jQuery:

  • AJAX 呼び出しで「POST」の代わりに「GET」を使用します。POSTはキャッシュされるべきではなく、正当にそうであるようです。
  • AJAX 呼び出しで "cache: true" を設定することは忘れてください。ブラウザのキャッシュを使用したくない場合、これは関係ありません。独自のクライアント キャッシング システムを展開する場合にのみ重要です。

サーバ側:

  • Last-Modified ヘッダーを常に送信する
  • 常に「Cache-control: private, max-age=1」を送信します
  • クライアントからの「If-Modified-Since」ヘッダーを確認し、変更されていない場合はペイロードなしで 304 を返し、そうでない場合は結果セット付きで 200 を返します。

上記のロジックを使用して、ブラウザーのキャッシュが 1 秒後に期限切れになるように設定し、サーバーに依存して、必要に応じて 304 コードを使用して新しいカタログを返す必要があるかどうかを正式に決定します。IE ではうまく動作しているようです。

上記の Apple モバイル ブラウザの誤動作に関する Brad のコメントに注意してください。私のユーザーのほんの一部が Apple モバイル デバイスを使用することになるため、ブラウザーのキャッシュを維持することに決めました。利点があまりにも信じられないほど見逃すことができないためです。 .

于 2013-03-02T22:59:42.713 に答える
1

キャッシュ ヘッダーなどをブラウザ間で互換性を持たせることは、正確な科学ではありません。ネットワークにヒットしても構わない場合は、これを試してください。

1) 一意の ID をカタログに添付してクライアントに送信し、ajax リクエストで返します。

2) その一意の ID が、キャッシュされたカタログの最新バージョンと一致するかどうかをテストします。存在する場合は、304 応答コードを返します。そうでない場合は、新しい一意の ID と共に新しいカタログを返します。

于 2013-03-01T17:51:31.363 に答える