AJAX का अप्रत्याशित कैशिंग IE8 में परिणाम देता है


135

मैं एक JQuery Ajax अनुरोध से इंटरनेट एक्सप्लोरर कैशिंग परिणामों के साथ एक गंभीर मुद्दा रहा हूँ।

मेरे पास अपने वेब पेज पर हेडर है जो हर बार अपडेट होता है जब कोई उपयोगकर्ता किसी नए पेज पर जाता है। पेज लोड होने के बाद मैं ऐसा करता हूं

$.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 को छोड़कर महान काम करता है । आईई पहली बार में ठीक से इंजेक्ट हो जाता है, लेकिन इसके बाद यह कभी भी कॉल नहीं करता है /game/getpuzzleinfo। यह ऐसा है जैसे इसने परिणामों या कुछ को कैश कर दिया है।

अगर मैं $.post("/game/getpuzzleinfo", ...IE को कॉल बदलता हूं तो यह ठीक है। लेकिन तब फ़ायरफ़ॉक्स काम करना छोड़ देता है।

क्या कोई इस पर कुछ प्रकाश डाल सकता है कि क्यों IE मेरे $.getअजाक्स कॉल को कैशिंग कर रहा है?

अपडेट करें

नीचे दिए गए सुझाव के अनुसार, मैंने अपना ajax अनुरोध इसमें बदल दिया है, जिससे मेरी समस्या ठीक हो गई:

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

8
यह पूछने के लिए धन्यवाद। मैं अवाक हूँ कि यह ब्राउज़र व्यवहार।
jjohn

1
अच्छा सवाल है, और वास्तव में अच्छा वेबसाइट। अच्छा विचार।
माइकमेर्को

जवाबों:


177

IE अजाक्स प्रतिक्रियाओं के अपने आक्रामक कैशिंग के लिए कुख्यात है। जैसा कि आप jQuery का उपयोग कर रहे हैं, आप एक वैश्विक विकल्प सेट कर सकते हैं:

$.ajaxSetup({
    cache: false
});

जो अनुरोध क्वेरी स्ट्रिंग में यादृच्छिक मान जोड़ने के लिए jQuery का कारण बनेगा, जिससे IE को प्रतिक्रिया को रोकना होगा।

ध्यान दें कि यदि आपके पास अन्य अजाक्स कॉल हैं जहां आप कैशिंग करना चाहते हैं, तो यह इसे उन लोगों के लिए भी अक्षम कर देगा। उस स्थिति में, $ .ajax () विधि का उपयोग करने के लिए स्विच करें और आवश्यक अनुरोधों के लिए स्पष्ट रूप से उस विकल्प को सक्षम करें।

अधिक जानकारी के लिए http://docs.jquery.com/Ajax/jQuery.ajaxSetup देखें ।


1
आप अपने url के अंत में टाइमस्टैम्प भी जोड़ सकते हैं। यकीन नहीं है कि jQuery इस दृष्टिकोण के साथ क्यों नहीं जाता है।
एरिक जॉनसन

14
@ एरिक: यही jQuery आंतरिक रूप से करता है - "कैश: गलत" विकल्प सिर्फ यह करने के लिए कहता है।
NickFitz

Jquery डिफ़ॉल्ट रूप से इस पर क्यों नहीं है?
स्पीडप्लेन

मैंने अभी देखा कि जब आप IE 8 में मुखपृष्ठ का अनुरोध करने का प्रयास करते हैं, तो कैश विकल्प काम नहीं करते हैं /। इसे बदलें /index.phpया जो भी पूर्ण url हो सकता है। या अपने आप में कुछ नकली /?f=f
परिंदों को शामिल करें

8

जैसा कि mar7575 में उल्लेख किया गया है, GETकैश्ड हैं।

इससे निपटने के कुछ तरीके हैं। प्रतिक्रिया शीर्षलेख को संशोधित करने के अलावा, आप लक्षित URL के अंत में बेतरतीब ढंग से उत्पन्न क्वेरी स्ट्रिंग चर भी जोड़ सकते हैं। इस तरह, IE यह हर बार अनुरोध किया जाता है एक अलग URL होगा।

इसे करने के कई तरीके हैं (जैसे कि उपयोग करना Math.random(), दिनांक पर भिन्नता इत्यादि)।

यहाँ एक तरीका है आप इसे कर सकते हैं:

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

3

हो जाता है हमेशा cacheable। एक रणनीति जो काम कर सकती है, वह है प्रतिक्रिया हेडर को संपादित करना और क्लाइंट को जानकारी को कैश न करना या कैश को बहुत जल्द समाप्त करना।


वह एक अच्छा विचार लगता है। मुझसे यह कैसे होगा?
मीका

1
यह एक लोडेड प्रश्न है, आपके सर्वर साइड कोड पर निर्भर करता है। थोड़ा मार्गदर्शन के लिए विकिपीडिया प्रविष्टि "HTTP हेडर की सूची" देखें। उदाहरण: कैश-कंट्रोल: नो-कैश एक्सपायर्स: थू, 01 दिसंबर 1994 16:00:00 GMT मूल रूप से आपको इन प्रतिक्रिया हेडर को अपनी http प्रतिक्रिया के साथ संलग्न करना होगा। यह ASP.NET, रूबी और PHP में काफी सरल है। बस उस सर्वर साइड भाषा को देखें जिसका आप उपयोग कर रहे हैं + प्रतिक्रिया शीर्षकों को संशोधित करें।
marr75

3
इसके अलावा, और यह बिल्कुल भी Jquery की आलोचना नहीं है (मुझे उस लाइब्रेरी से प्यार है), एक यादृच्छिक क्वेरी स्ट्रिंग पैरामीटर को जोड़ने का तरीका सुरक्षित है, लेकिन क्लाइंट को इम्प्लॉई देता है (यह उन्हें कैश में उन वस्तुओं पर पकड़ छोड़ सकता है जो कभी भी उपयोग नहीं किए जाएंगे। फिर)।
marr75

2

यदि आप ashx पृष्ठ पर कॉल कर रहे हैं, तो आप निम्नलिखित कोड के साथ सर्वर पर कैशिंग को भी अक्षम कर सकते हैं:

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

1

यह मैं अजाक्स कॉल के लिए क्या है:

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 मेथड का उपयोग किया जाता है।

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) का उपयोग नहीं कर सकता था, इसलिए मैंने इसके बजाय एक पोस्ट किए गए चर के रूप में कैश बस्टिंग पैरामीटर लिखा था ..... मैंने सोचा होगा POST चर का उपयोग करने वाले थोड़ा सुरक्षित हैं, इसलिए कि MVC फ्रेमवर्क के बहुत सारे पैटर्न का उपयोग करते हैं

प्रोटोकॉल: // मेजबान / नियंत्रक / कार्रवाई / param1 / param2

और इसलिए मूल्य के लिए चर नाम की मैपिंग खो गई है, और परम बस स्टैक किए गए हैं ... इसलिए GET कैश बस्टर पैरामीटर का उपयोग करते समय

अर्थात प्रोटोकॉल: // होस्ट / कंट्रोलर / एक्शन / परम 1 / पैराम 2 / no_cache122300201

no_cache122300201 को $ परम 3 पैरामीटर के लिए गलत माना जा सकता है, जिसमें डिफ़ॉल्ट मान हो सकता है

अर्थात

सार्वजनिक कार्य क्रिया ($ param1, $ param2, $ param3 = "डिफ़ॉल्ट मान") {//..//}

POSTED कैश बस्टर के साथ ऐसा होने का कोई मौका नहीं


0

यदि आप ASP.NET MVC का उपयोग कर रहे हैं, तो नियंत्रक क्रिया के शीर्ष पर इस लाइन को जोड़ना पर्याप्त है:

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

}

प्रश्न का व्यवहार ब्राउज़र की तरफ है; यह उत्तर सर्वर साइड पर कैशिंग से संबंधित है।
मार्क सोउल

@MarkSowul Outputcache में 3 विकल्प क्लाइंट, सर्वर और कोई भी हैं। IE आउटपुटकाच का उपयोग किसी भी डिफ़ॉल्ट के रूप में करता है जो ज्यादातर क्लाइंट साइड कैशिंग के रूप में जाता है। आप देख सकते हैं और अधिक जानकारी के लिए यहाँ dougwilsonsa.wordpress.com/2011/04/29/...
batmaci

@MarkSowul आप संबंधित प्रश्न और उत्तर यहां भी देख सकते हैं। क्या आपको लगता है कि यह सर्वर की तरफ भी है? stackoverflow.com/questions/2653092/…
बैटमासी

1
हाँ, क्षमा करें, आप सही हैं - मुझे यह महसूस नहीं हुआ कि आपका उत्तर सर्वर-साइड कैश और क्लाइंट-साइड कैश दोनों को प्रभावित कर सकता है ।
मार्क सोउल

-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/ :

कुछ लोग कैश - कंट्रोल: नो - कैश हेडर को एक्सपायर करने के बजाय इस्तेमाल करना पसंद करते हैं। यहाँ अंतर है:
कैश-कंट्रोल: नो-कैश - बिल्कुल नहीं कैशिंग
समाप्त: -1 - ब्राउज़र "आमतौर पर" एक सशर्त इफ़-मॉडिफ़ाइड-रिक्वेस्ट अनुरोध के माध्यम से उस पेज के अपडेट के लिए वेब सर्वर से संपर्क करता है। हालांकि, पृष्ठ डिस्क कैश में रहता है और इसका उपयोग दूरस्थ वेब सर्वर से संपर्क किए बिना उपयुक्त स्थितियों में किया जाता है, जैसे कि नेविगेशन इतिहास को एक्सेस करने के लिए या जब ब्राउज़र ऑफ़लाइन मोड में होता है तो बैक और फॉरवर्ड बटन का उपयोग किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.