おぼえがき.NET

C#.NETとかMVCとかについて勉強したことの覚え書き ほぼ自分用 たまに趣味の開発とかゲームとか漫画とかも載せるかも

だいぶ前に書いた覚え書きその2 IEでのJQuery.Ajaxの挙動について

非同期での通信が容易にできるようになり、非常に便利なJQuery.Ajaxですが、
Internet Explorerで特定の条件の場合、うまく機能しないことがあります。

問題

利用ブラウザがInternet Explorerのとき、
JQuery.Ajax、もしくはJQuery.getJSONを使い、
送信するパラメータを変えずにGET属性の通信を行うと、
二回目以降の戻り値が、一回目のものと同一になる

原因

IEXmlHttpRequestでのやりとりを行った際、その値をキャッシュします。
JQuery.AjaxXmlHttpRequestオブジェクトを返しているので、
その影響を受けているようです。

次回以降、パラメータが同じかつGet属性の通信が行われた場合、
キャッシュに保存してある値を返すようになります。

対策

対策はいくつかあります。

1.POST属性にして通信を行う。
あくまでキャッシュに残るのはGETの通信を行った時だけです。
Ajaxのオプションで属性をPOSTにしてしまうか、
JQuery.postを利用すれば、キャッシュの値が返されることはありません。

が、例えば問合せ先のActionResultにHttpGet属性を付けたりしたら、
この対策は即座に破綻してしまいます。

 

2.パラメータに常に変動するデータを入れる
パラメータ内にTimeStampのようなデータを用意し、
中身にはDatetime.NowやGUIDのようなユニークな値を入れて通信を行うようにします。

毎回送るパラメータが異なるので、キャッシュを利用することがありません。

 

3.OptionのCatchをfalseにする
Catchはキャッシュを制御するためのオプションで、
デフォルトではTrueとなっています。
これをfalseに指定してやることで、キャッシュを行わないように指定できます。

同様に、ifModifiedのオプションをTrueにしてやることで、
サーバ側のコンテンツの変更があったかどうかを確認し、
変更がなかった時だけキャッシュを表示する、という挙動にしてやることも可能です。

が、これらはJQuery.Ajaxのみ可能な方法で、
getJSONには利用できません。

まとめ

個人的には3推奨。

なんで、Ajaxでオプションを書くのがめんどくさくても、
あとあとのことを考えて、
できるだけgetJSONで書かないようにしましょう。