IE8でのAJAXの予期しないキャッシュ結果


135

JQuery AjaxリクエストによるInternet Explorerのキャッシュ結果に深刻な問題があります。

Webページにヘッダーがあり、ユーザーが新しいページに移動するたびに更新されます。ページが読み込まれたら、これを行います

$.get("/game/getpuzzleinfo", null, function(data, status) {
    var content = "<h1>Wikipedia Maze</h1>";
    content += "<p class='endtopic'>Looking for <span><a title='Opens the topic you are looking for in a separate tab or window' href='" + data.EndTopicUrl + "' target='_blank'>" + data.EndTopic + "<a/></span></p>";
    content += "<p class='step'>Step <span>" + data.StepCount + "</span></p>";
    content += "<p class='level'>Level <span>" + data.PuzzleLevel.toString() + "</span></p>";
    content += "<p class='startover'><a href='/game/start/" + data.PuzzleId.toString() + "'>Start Over</a></p>";

    $("#wikiheader").append(content);

}, "json");

ヘッダー情報をページに挿入するだけです。www.wikipediamaze.comにアクセスしてログインし、新しいパズルを開始することで確認できます。

私がテストしたすべてのブラウザー(Google Chrome、Firefox、Safari、Internet Explorer)で、IE を除いてうまく機能します。EveythingはIE で初めて正常に挿入されますが、その後はへの呼び出しも行いません/game/getpuzzleinfo。結果か何かをキャッシュしたようなものです。

$.post("/game/getpuzzleinfo", ...IE への呼び出しを変更すると、問題なくピックアップされます。しかしその後、Firefoxは機能しなくなります。

IEがなぜ私の$.getajax呼び出しをキャッシュしているのか、誰かがこれに光を当てることができますか?

更新

以下の提案に従って、私は私のajaxリクエストをこれに変更しました、それが私の問題を修正しました:

$.ajax({
    type: "GET",
    url: "/game/getpuzzleinfo",
    dataType: "json",
    cache: false,
    success: function(data) { ... }
});

8
これを聞いてくれてありがとう。私はこのブラウザの振る舞いについて言葉を失いました。
jjohn 2011

1
良い質問、そして本当にクールなウェブサイト。良いアイデア。
MikeMurko

回答:


177

IEは、Ajax応答の積極的なキャッシングで有名です。jQueryを使用しているので、グローバルオプションを設定できます。

$.ajaxSetup({
    cache: false
});

これにより、jQueryが要求クエリ文字列にランダムな値を追加するため、IEが応答をキャッシュできなくなります。

キャッシュが必要な場所で他のAjax呼び出しが行われている場合は、これによってそれらのキャッシュも無効になります。その場合は、$。ajax()メソッドの使用に切り替え、必要なリクエストに対してそのオプションを明示的に有効にします。

詳細については、http://docs.jquery.com/Ajax/jQuery.ajaxSetupを参照してください。


1
URLの最後にタイムスタンプを追加することもできます。jQueryが代わりにこのアプローチを採用しない理由がわかりません。
エリックジョンソン

14
@Eric:これはjQueryが内部で行うことです-"cache:false"オプションは単にそれを行うように指示します。
NickFitz 2009

jqueryがデフォルトでこれをオンにしないのはなぜですか?
スピードプレーン

を呼び出してIE 8でホームページをリクエストしようとすると、キャッシュオプションが機能しないことに気づきました/。変更する/index.phpか、完全なURLに変更します。または、自分のように偽の/?f=f
パラメータ

8

以下のようmarr75が述べたように、GETさんがキャッシュされます。

これと戦う方法はいくつかあります。応答ヘッダーを変更する以外に、ランダムに生成されたクエリ文字列変数をターゲットURLの末尾に追加することもできます。このように、IEは要求されるたびに異なるURLであると見なします。

これを行うには複数の方法があります(使用Math.random()、日付のバリエーションなど)。

これを行う方法の1つを次に示します。

var oDate = new Date();
var sURL = "/game/getpuzzleinfo?randomSeed=" + oDate.getMilliseconds();
$.get(sURL, null, function(data, status) {
    // your work
});

3

取得は常にキャッシュ可能です。機能する可能性のある戦略の1つは、応答ヘッダーを編集して、情報をキャッシュしないか、キャッシュをすぐに期限切れにするようにクライアントに指示することです。


いいアイデアだね。どうすればいいですか?
ミカ

1
これは読み込まれた質問です。サーバー側のコードによって異なります。ウィキペディアの「HTTPヘッダーのリスト」の小さなガイダンスを参照してください。例:Cache-Control:no-cache有効期限:Thu、01 Dec 1994 16:00:00 GMT基本的に、これらの応答ヘッダーをhttp応答に追加する必要があります。ASP.NET、Ruby、およびPHPでは非常に簡単です。+使用しているサーバー側の言語を調べて、応答ヘッダーを変更します。
marr75 2009年

3
また、これはJqueryの批評ではありません(私はそのライブラリが大好きです)、ランダムなクエリ文字列パラメータを追加する方法は安全ですがクライアントには失礼です(使用されないキャッシュ内のアイテムを保持したままにすることができます)再び)。
marr75 2009年

2

ashxページを呼び出す場合は、次のコードを使用してサーバーのキャッシュを無効にすることもできます。

context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 

1

これは私がajax呼び出しのために何をするかです:

var url = "/mypage.aspx";
// my other vars i want to add go here
url = url + "&sid=" + Math.random();
// make ajax call

それは私にはかなりうまくいきます。


1

NickFitzは良い答えを出しますが、IE9でもキャッシュをオフにする必要があります。IE8とIE9のみをターゲットにするために、これを行うことができます。

<!--[if lte IE 9]>
<script>
    $.ajaxSetup({
        cache: false
    });
</script>
<![endif]-->

0

ここでの回答は、jQueryを使用するか、何らかの理由でxmlHttpRequestオブジェクトを直接使用するユーザーにとって非常に役立ちます...

自動生成されたMicrosoftサービスプロキシを使用している場合、解決はそれほど簡単ではありません。

トリックは、イベントハンドラーでSys.Net.WebRequestManager.add_invokingRequestメソッドを使用して、要求のURLを変更することです。

networkRequestEventArgs._webRequest._url = networkRequestEventArgs._webRequest._url + '&nocache=' + new Date().getMilliseconds(); 

私はこれについてブログに書いています:http : //yoavniran.wordpress.com/2010/04/27/ie-caching-ajax-results-how-to-fix/


0

ExtJSのみを使用してこの問題に関するブログを書いたところです(http://thecodeabode.blogspot.com/2010/10/cache-busting-ajax-requests-in-ie.html

問題は、特定のURL書き換えフォーマットを使用していたため、従来のクエリ文字列パラメーター(?param = value)を使用できなかったため、代わりにキャッシュ無効化パラメーターをポストされた変数として書き込んだことでした。多くのMVCフレームワークがパターンを使用するため、POST変数を使用するとGETよりも少し安全です。

protocol:// host / controller / action / param1 / param2

変数名から値へのマッピングは失われ、パラメーターは単純にスタックされます... GETキャッシュバスターパラメーターを使用する場合

すなわちprotocol:// host / controller / action / param1 / param2 / no_cache122300201

no_cache122300201は、デフォルト値を持つ可能性のある$ param3パラメータと間違われる可能性があります

すなわち

public function action($ param1、$ param2、$ param3 = "default value"){//..//}

POSTEDキャッシュバスターで発生する可能性はありません


0

ASP.NET MVCを使用している場合は、コントローラーアクションの上に次の行を追加するだけで十分です。

[OutputCache(NoStore=true, Duration = 0, VaryByParam = "None")]
public ActionResult getSomething()
{

}

問題の動作はブラウザ側にあります。この答えは、サーバー側のキャッシングに関するものです。
Mark Sowul 16

@MarkSowul Outputcacheには、クライアント、サーバー、その他の3つのオプションがあります。IEはデフォルトでOutputCacheを使用します。これは主にクライアント側のキャッシングとして機能します。あなたは、ここで詳細を見ることができますdougwilsonsa.wordpress.com/2011/04/29/...
batmaci

@MarkSowul関連する質問と回答もここで確認できます。これもサーバー側だと思いますか?stackoverflow.com/questions/2653092/…–
batmaci

1
はい、申し訳ありませんが、あなたの言う通りです。あなたの答えがサーバー側のキャッシュとクライアント側のキャッシュの両方に影響を与える可能性があるとは知りませんでした。
Mark Sowul

-1

IEはこのキャッシングを行う権利を有します。アイテムがキャッシュされないようにするには、それに応じてヘッダーを設定する必要があります。

ASP.NET MVCを使用している場合は、ActionFilter; でOnResultExecuted、チェックしてくださいfilterContext.HttpContext.Request.IsAjaxRequest()。その場合は、応答の有効期限ヘッダーを設定します。filterContext.HttpContext.Response.Expires = -1;

http://www.dashbay.com/2011/05/internet-explorer-caches-ajax/に従って:

Cache-Control:no-有効期限の代わりにキャッシュヘッダーを使用することを好む人もいます。違いは次のとおりです
。Cache-Control:no-cache –完全にキャッシングなし
Expires:-1 –ブラウザーは「通常」、条件付きのIf-Modified-Sinceリクエストを介してそのページの更新をWebサーバーに問い合わせます。ただし、ページはディスクキャッシュに残り、ナビゲーションの履歴にアクセスするために[戻る]および[進む]ボタンが使用されるときや、ブラウザーがオフラインモードのときなど、リモートWebサーバーに接続せずに適切な状況で使用されます。

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