$ .getJSONがIE8でキャッシュされたデータを返す


102

現在、ASP.net MVCとJQueryをいじっています。意味がなさそうな行動に出くわしました。

私は$.getJSONいくつかのdivを生成するためにJQueryの関数を呼び出しています。イベントはイベントでトリガーされ$(document).readyます。これは完全に機能します。

AJAX.BeginFormdivに入力するときに使用される別の値を追加する小さなものがあります。リモート関数を正しく呼び出し、成功すると元のJavaScript関数を呼び出してdivを再生成します。

ここで奇妙な部分があります:FireFoxとChrome-すべてが機能します。しかしIE8(ベータ)では、populate Divスクリプト($ .getJSON関数を呼び出す)へのこの2番目の呼び出しはキャッシュされたデータを取得し、サーバーに問い合わせません!

この質問が理にかなっているといいのですが:簡単に言えば、なぜ$.getJSONキャッシュされたデータを取得するのですか?そして、なぜそれはIE8にのみ影響するのですか?


不思議なことに、このバグはIEだけでなくFirefoxにも見られます。jqueryでajaxキャッシングを無効にすることが役に立ちました。
JosefSábl10年

回答:


67

ただお知らせしておきますが、FirefoxとChromeはすべてのAjaxリクエストをキャッシュ不可と見なします。IE(すべてのバージョン)は、Ajax呼び出しを他のWebリクエストと同様に扱います。そのため、この動作が見られます。
各リクエストでIEにデータをダウンロードさせる方法:

  • あなたが言ったように、JQueryで「キャッシュ」または「nocache」オプションを使用してください
  • リクエストにランダムパラメータを追加します(醜いが、動作します:))
  • サーバー側でキャッシュ可能性を設定します(たとえば、属性を使用して、以下を参照)

コード:

public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}

1
このソリューションは私にとって魅力的です。私はMVCで属性を適用する優雅さを本当に気に入っています
Andrew Harry、

1
今日、OutputCacheAttribute OOTBがあります。
bzlm 2009年

1
@bzlmですが、これは検索が簡単です
Simon_Weaver

クライアント側のソリューションについては、formatinternet.wordpress.com / 2010/01/14 /…を確認してください
Ivo

1
実際、それは逆ですが、開発者IEには忍耐が必要なので同意します:)
ニコ

107

これは私にとってどのように機能したかです...

$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
     // do stuff with callback data
     $.ajaxSetup({ cache: true });
   });

私はこの問題に苦労しており、あなたの解決策はそれをすばやく解決する方法を提供しました。:)質問があります。$。ajaxSetupに使用できるオプションを知っていますか?残念ながらjQueryのドキュメントには詳細が記載されていません...
Achimnol 2009

1
使用可能なオプションは$ .ajaxと同じです。詳細については、docs.jquery.com / Ajax / jQuery.ajax# optionsを参照してください
Dan Esparza

12
上記のコードに対する小さな警告-競合状態が含まれています。呼び出しとその応答は非同期であるため、コールバックではなく、$.ajaxSetup({ cache: true });直後に 呼び出す必要getJSON()があります。
sax

16

回答をありがとう、ケント。$ .ajax( '{cache:no}');を使用する 完璧に働いた。[編集]

または、少なくとも私はそう思った。jquery $ .getJSONが$ .ajaxオブジェクトに加えられた変更を読み取っていないようです。

最終的に機能する解決策は、新しいパラメーターを手動で追加することでした

var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);

日付の解像度は分単位です。これは事実上、このソリューションが最大1分間キャッシュすることを意味します。これは私の目的で許容できます。


9
var noCache = new Date()。getTime(); // msを表示します
scunliffe 2008年

Scunliffeに感謝します。-私はJavaScriptにかなり慣れていません。ASPMVCは私に新しい展望を開きました
Andrew Harry

Math.Random()のようなものを試すこともできます。
Falkayn 2009

@Falkayn-タフMath.Random()を使用できますが、その結果は不明であり、同じ番号が連続して2回(またはそれ以上)取得される可能性があります。を使用new Date().getTime()すると、それが繰り返されることはありません。(あなたが時間を遡ることができる場合を除き、;))
認知症

11

コントローラのアクションに次の属性を配置することで、この同じ問題を解決しました。

[OutputCache(Duration = 0, VaryByParam = "None")]

素晴らしい!選択肢があるのは素晴らしい(これを選択した)。すべての貢献者に感謝します!
アンダースジュール2010

Asp.Net MVC 4.0で正常に動作します
Mayank

4

ASP.net MVCを使用している場合は、拡張メソッドを追加して、次のように簡単にキャッシュを実装しないことを検討してください。

    public static void NoCache(this HttpResponse Response)
    {
        Response.Cache.SetNoStore();
        Response.Cache.SetExpires(DateTime.MinValue);
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetValidUntilExpires(false);

        Response.Expires = -1;
        Response.ExpiresAbsolute = DateTime.MinValue;
        Response.AddHeader("Cache-Control", "no-cache");
        Response.AddHeader("Pragma", "no-cache");
    }

いい考え-コールバック中にサーバーでこの拡張メソッドを呼び出すのですか?
ガイ

2

キャッシュブレーカーを送信する必要がある場合があります。

念のために$ .ajax({cache:no})を使用することをお勧めします(getリクエストにランダムなサフィックスを追加します)

(私は最近、どこでも$ .ajaxを使用する傾向があり、より調整可能です)


あなたの答えをありがとう!...私はまだそれを試していません。まもなくフィードバックが提供されます
Andrew Harry、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.