$ .getJSON IE8 में कैश्ड डेटा लौटाता है


102

मैं इस समय ASP.net MVC और JQuery के साथ खेल रहा हूं। मैं व्यवहार में आया हूं जो समझ में नहीं आता है।

मैं JIV के $.getJSONफंक्शन को कॉल कर रहा हूँ ताकि कुछ div को पॉपुलेट किया जा सके। घटना पर घटना को ट्रिगर किया जाता है $(document).ready। यह पूरी तरह से काम करता है।

एक छोटा सा है AJAX.BeginFormजो divs को पॉप्युलेट करते समय उपयोग किए जाने वाला एक और मान जोड़ता है। यह दूरस्थ फ़ंक्शन को सही ढंग से कॉल करता है और सफलता पर मूल जावास्क्रिप्ट फ़ंक्शन को divs को फिर से खोलने के लिए कहता है।

यहाँ अजीब हिस्सा है: फ़ायरफ़ॉक्स और क्रोम में - सब कुछ काम करता है। लेकिन IE8 (बीटा) में यह दूसरा Div Div स्क्रिप्ट (जिसे $ .getJSON फ़ंक्शन कहता है) को पॉप्युलेट करने के लिए कॉल्स डेटा प्राप्त होता है और सर्वर से नहीं पूछता है!

आशा है कि यह प्रश्न समझ में आता है: अखरोट के खोल में - $.getJSONकैश्ड डेटा क्यों मिल रहा है? और यह केवल IE8 को क्यों प्रभावित कर रहा है?


अजीब बात है, मैं इस बग को न केवल IE में, बल्कि फ़ायरफ़ॉक्स में भी देखता हूं। Jquery में अजाक्स कैशिंग को अक्षम करने से मुझे मदद मिली।
जोसेफ सेबल

जवाबों:


67

बस आपको बता दें, फ़ायरफ़ॉक्स और क्रोम सभी अजाक्स अनुरोध को गैर-कैशेबल मानते हैं। IE (सभी संस्करण) अन्य वेब अनुरोध के रूप में अजाक्स कॉल का इलाज करते हैं। इसलिए आप इस व्यवहार को देखें।
प्रत्येक अनुरोध पर डेटा डाउनलोड करने के लिए IE को कैसे बाध्य करें:

  • जैसा कि आपने कहा, JQuery में 'कैश' या 'nocache' विकल्प का उपयोग करें
  • अनुरोध में एक यादृच्छिक पैरामीटर जोड़ें (बदसूरत, लेकिन काम करता है :))
  • सर्वर साइड पर, सेटैबिलिटी सेट करें (उदाहरण के लिए एक विशेषता का उपयोग करके, नीचे देखें)

कोड:

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

1
यह समाधान मुझे अपील करता है। मैं वास्तव में MVC में एक attibute लागू करने की शान की तरह
एंड्रयू हैरी

1
आजकल एक OutputCacheAttribute OOTB है।
bzlm

1
@bzlm लेकिन इसके लिए खोज करना आसान है
सिमोन_विवर

बाहर की जाँच formatinternet.wordpress.com/2010/01/14/... एक ग्राहक के पक्ष समाधान के लिए
इवो

1
वास्तव में, यह दूसरा तरीका है, लेकिन मैं एक डेवलपर के रूप में सहमत हूँ IE को धैर्य की आवश्यकता है :)
निको

107

इस तरह यह मेरे लिए काम किया ...

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

मैं इस समस्या से जूझ रहा था और आपके समाधान ने इसे हल करने का एक त्वरित तरीका दिया। :) मेरा एक सवाल है, क्या आप जानते हैं कि $ .ajaxSetup के लिए कौन से विकल्प इस्तेमाल किए जा सकते हैं? jQuery प्रलेखन दुर्भाग्य से विवरण प्रदान नहीं करता है ...
Achimnol

1
उपलब्ध विकल्प $ .ajax के समान हैं। अधिक जानकारी के लिए docs.jquery.com/Ajax/jQuery.ajax#options देखें
Dan Esparza

12
उपरोक्त कोड के लिए थोड़ी सी चेतावनी - इसमें दौड़ की स्थिति शामिल है। क्योंकि कॉल और उसकी प्रतिक्रिया अतुल्यकालिक हैं, आपको कॉलबैक में $.ajaxSetup({ cache: true });सही कॉल करना चाहिए getJSON()और नहीं।
सैक्स

16

आपके उत्तर के लिए धन्यवाद केंट। $ .Ajax ('{कैश: नहीं}') का उपयोग करना; पूरी तरह से काम किया। [संपादित करें]

या कम से कम मुझे लगा कि मैंने किया है। लगता है कि jquery $ .getJSON $ .ajax ऑब्जेक्ट में किए गए किसी भी बदलाव को नहीं पढ़ रहा है।

जो समाधान काम कर रहा था, उसे मैन्युअल रूप से एक नया पैरामीटर जोड़ना था

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

दिनांक रिज़ॉल्यूशन केवल मिनट तक है; जो प्रभावी रूप से इसका मतलब है कि यह समाधान अभी भी एक मिनट तक के लिए है। यह मेरे उद्देश्यों के लिए स्वीकार्य है।


9
var noCache = new Date ()। getTime (); // आपको एमएस को देगा
scunliffe

धन्यवाद Scunliffe! - मैं जावास्क्रिप्ट के लिए बहुत नया हूं, एएसपी एमवीसी ने मेरे लिए नए क्षितिज खोले हैं
एंड्रयू हैरी

आप भी कुछ कोशिश कर सकते हैं जैसे Math.Random ()।
फाल्केन

@ फाल्कन - कठिन Math.Random()का उपयोग किया जा सकता है, इसके परिणाम अज्ञात होंगे और आपको एक ही संख्या में दो बार एक पंक्ति (या अधिक) मिल सकती है। उपयोग करने new Date().getTime()से यह सुनिश्चित हो जाएगा कि यह कभी दोहराया न जाए। (जब तक आप समय में वापस जाने में सक्षम नहीं होते हैं;))
डिंमेटिक

11

मैंने नियंत्रक पर कार्रवाई में निम्नलिखित विशेषता रखकर इस समस्या को हल किया:

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

आश्चर्यजनक! विकल्प के लिए बढ़िया (मैंने इसे चुना)। सभी योगदानकर्ताओं को धन्यवाद!
एंडर्स जुएल

Asp.Net MVC 4.0 के साथ ठीक काम करता है
मयंक

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 ({कैश: नहीं}) का उपयोग करने की सलाह दूंगा (प्राप्त अनुरोध में एक यादृच्छिक प्रत्यय जोड़ता है)

(मैं इन दिनों हर जगह $ .ajax का उपयोग करने के लिए अधिक ट्यून करने योग्य हूं)


आपके उत्तर के लिए धन्यवाद! ... मैंने अभी तक इसकी कोशिश नहीं की है। शीघ्र ही वापस फ़ीड प्रदान करेगा
एंड्रयू हैरी

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