ASP.NET से सभी ब्राउज़रों के लिए ब्राउज़र कैशिंग अक्षम करना


87

पेज को कैशिंग से अक्षम ब्राउज़रों के लिए ASP.NET कोड की आवश्यकता के संदर्भ में मैं निश्चित संदर्भ के बाद हूं। HTTP हेडर और मेटा टैग को प्रभावित करने के कई तरीके हैं और मुझे लगता है कि विभिन्न ब्राउज़रों को सही ढंग से व्यवहार करने के लिए विभिन्न सेटिंग्स की आवश्यकता होती है। कोड को संदर्भित करने के लिए टिप्पणी करना वास्तव में बहुत अच्छा होगा, यह इंगित करने के लिए कि सभी ब्राउज़रों के लिए कौन सा कार्य करता है और कौन से संस्करणों के लिए विशेष ब्राउज़र के लिए आवश्यक है।

इस मुद्दे के बारे में जानकारी की एक बड़ी मात्रा है लेकिन मुझे अभी तक एक अच्छा संदर्भ नहीं मिला है जो प्रत्येक विधि के लाभों का वर्णन करता है और क्या किसी विशेष तकनीक को उच्च स्तर के एपीआई द्वारा अधिगृहीत किया गया है।

मुझे ASP.NET 3.5 SP1 में विशेष रूप से दिलचस्पी है, लेकिन पहले के संस्करण के लिए भी उत्तर प्राप्त करना अच्छा होगा।

यह ब्लॉग प्रवेश फ़ायरफ़ॉक्स और IE कैशिंग के बीच दो महत्वपूर्ण अंतरों का वर्णन करता है कुछ HTTP प्रोटोकॉल व्यवहार अंतर।

निम्न नमूना कोड उस चीज़ को दिखाता है जिस तरह की मुझे दिलचस्पी है

public abstract class NoCacheBasePage : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        DisableClientCaching();
    }

    private void DisableClientCaching()
    {
        // Do any of these result in META tags e.g. <META HTTP-EQUIV="Expire" CONTENT="-1">
        // HTTP Headers or both?

        // Does this only work for IE?
        Response.Cache.SetCacheability(HttpCacheability.NoCache);

        // Is this required for FireFox? Would be good to do this without magic strings.
        // Won't it overwrite the previous setting
        Response.Headers.Add("Cache-Control", "no-cache, no-store");

        // Why is it necessary to explicitly call SetExpires. Presume it is still better than calling
        // Response.Headers.Add( directly
        Response.Cache.SetExpires(DateTime.UtcNow.AddYears(-1));
    }
}

5
मैं जवाब देने की कोशिश करूंगा कि अगर मुझे नहीं पता था कि आपका काम कितना असंभव है। क्लाइंट के कैश को नियंत्रित करना फर्नीचर को फिर से व्यवस्थित करने के लिए 10 फुट लंबी चॉपस्टिक्स का उपयोग करने की कोशिश करना है।
जेफ मीटबॉल यांग

समस्याओं के सिर्फ एक हिस्से को कवर करने वाले कई सारे जवाब अभी भी बहुत मूल्यवान होंगे। कृपया अपने 2 सेंट के मूल्य में फेंक दें।
मार्टिन होलिंग्सवर्थ

जवाबों:


96

यह हम ASP.NET में उपयोग करते हैं:

// Stop Caching in IE
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

// Stop Caching in Firefox
Response.Cache.SetNoStore();

यह फ़ायरफ़ॉक्स और IE में कैशिंग को रोकता है, लेकिन हमने अन्य ब्राउज़रों की कोशिश नहीं की है। इन बयानों द्वारा निम्नलिखित प्रतिक्रिया शीर्षकों को जोड़ा जाता है:

Cache-Control: no-cache, no-store
Pragma: no-cache

5
+1 यह मेरे लिए क्रोम में काम कर रहा है, बहुत बहुत धन्यवाद। मैं भी Response.Cache.SetAllowResponseInBrowserHistory (सच) का उपयोग करता हूं; एक ही पृष्ठ के प्रत्येक अनुरोध के लिए एक प्रविष्टि संग्रहीत करने के लिए इतिहास से बचने के लिए।
डेनिलियोक्विओ

12
जाहिर तौर पर किसी ने पता लगाया है कि NoCache के साथ SetCacheability का उपयोग करने से ASP.NET आउटपुट कैश (सर्वर-साइड कैश) भी अक्षम हो जाता है। वे इसके बजाय ServerAndNoCache विकल्प का उपयोग करने का सुझाव देते हैं। codeclimber.net.nz/archive/2007/04/01/…
md1337

1
कोड स्निपेट में टिप्पणियों को स्पष्ट करने के लिए, मुख्य विधि है SetCacheabilitySetNoStoreएक IE6 वर्कअराउंड है। देखें कि HTTP प्रतिक्रिया में नो-कैश और नो-स्टोर दोनों का उपयोग क्यों किया जाना चाहिए?
एडवर्ड ब्रे

3
FWIW ... IE10 के लिए SetNoStore को जोड़ने की आवश्यकता है
felickz

इस पृष्ठ को पढ़ने वालों के लिए, जो https पर डायनेमिक PDF आउटपुट कर रहे हैं और इस तरह कैश हेडर सेट कर रहे हैं, कृपया निम्नलिखित IE8 और निम्न बग से सावधान रहें: stackoverflow.com/questions/1038707/…
Paddy

41

इसके लायक क्या है, मुझे सिर्फ अपने ASP.NET MVC 3 एप्लिकेशन में इसे संभालना था। यहाँ सभी अनुरोधों को संभालने के लिए Global.asax फ़ाइल में कोड ब्लॉक का उपयोग किया गया है।

    protected void Application_BeginRequest()
    {
        //NOTE: Stopping IE from being a caching whore
        HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false);
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Cache.SetNoStore();
        Response.Cache.SetExpires(DateTime.Now);
        Response.Cache.SetValidUntilExpires(true);
    }

HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)IE और Firefox bith में कैशिंग को रोकने के लिए फर्क पड़ा
माइकल Kniskern

2
-1, इन Application_BeginRequest () में सेटिंग के कारण नो-कैश हेडर उन आइटमों के लिए भेजे जाते हैं, जिन्हें आप शायद कैशेड (जावास्क्रिप्ट फ़ाइलें, चित्र आदि) चाहते हैं। मैंने अभी तक इसकी कोशिश नहीं की है, लेकिन ओपी का स्थान (एएसपी पृष्ठ में हेडर स्थापित करना) शायद बेहतर है।
इवान हास

मुझे उम्मीद है कि यह जवाब काम करने के लिए है क्योंकि यह glabal.asax में इसे सेट करने का सबसे अच्छा तरीका है, लेकिन अभी तक कोई खुशी नहीं है
लॉफोटॉग

5
@ इवान, Application_BeginRequest केवल उन अनुरोधों के लिए कहा जाएगा जो IIS से ASP.NET को भेजे जाते हैं। कई बार, CSS, JS, Images, Fonts आदि जैसे स्थिर फाइल्स ऐसे एक्सटेंशन होते हैं, जिन्हें IIS से स्टैटिक फाइल माना जाता है और ASP.NET रनटाइम को नहीं भेजा जाता है। यदि IIS को ASP.NET रनटाइम के लिए सभी अनुरोध भेजने के लिए सेट किया गया है, तो हाँ, यह सभी अनुरोधों पर लागू होगा, भले ही फाइलें स्थिर हों और कैश किया जाना चाहिए।
एडम कैर

@ अदम, समझ में आता है। मैं अपने -1 को पूर्ववत कर दूंगा, लेकिन एसओ का कहना है कि मेरा वोट इसमें बंद है :-(
इवान हास

2

मैंने विभिन्न संयोजनों की कोशिश की है और उन्हें फ़ायरफ़ॉक्स में विफल कर दिया है। यह एक समय हो गया है इसलिए ऊपर दिए गए उत्तर ठीक काम कर सकते हैं या मुझे कुछ याद हो सकता है।

मेरे लिए हमेशा काम किया है प्रत्येक पृष्ठ के प्रमुख, या टेम्पलेट (.net में मास्टर पृष्ठ) के बाद निम्न जोड़ने के लिए है।

<script language="javascript" type="text/javascript">
    window.onbeforeunload = function () {   
        // This function does nothing.  It won't spawn a confirmation dialog   
        // But it will ensure that the page is not cached by the browser.
    }  
</script>

इसने मेरे लिए सभी ब्राउज़रों में सभी कैशिंग को बिना किसी असफलता के अक्षम कर दिया है।


7
यह निश्चित नहीं है कि यह क्या करना है, लेकिन यह एक बड़ी वसा हैक की तरह दिखता है जो इनमें से किसी भी ब्राउज़र के अगले अपडेट में विफल होने के लिए बाध्य है।
md1337

यह समझाया जाता है जैसे कि web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/… - सारांश में, onbeforeunload घटना को बैंकों द्वारा उपयोग किए जाने के लिए लागू किया गया था और पृष्ठ को कैश होने से बचाता है।
क्रिस डब्ल्यूडब्ल्यू

1

दो दृष्टिकोण हैं जो मुझे पता हैं। पहला यह है कि ब्राउज़र को पृष्ठ को कैश न करने के लिए कहा जाए। रिस्पांस को नो कैश पर सेट करने से इसका ध्यान रखा जाता है, हालाँकि जैसा कि आपको संदेह है कि ब्राउज़र अक्सर इस निर्देश की अनदेखी करेगा। अन्य दृष्टिकोण भविष्य में एक बिंदु पर आपकी प्रतिक्रिया की तारीख का समय निर्धारित करना है। मेरा मानना ​​है कि सभी ब्राउज़र वर्तमान समय में इसे ठीक कर देंगे जब वे पृष्ठ को कैश में जोड़ देंगे, लेकिन तुलना किए जाने पर यह पृष्ठ को नया दिखाएगा। मेरा मानना ​​है कि ऐसे कुछ मामले हो सकते हैं जहां तुलना नहीं की गई है। मुझे विवरणों पर यकीन नहीं है और वे प्रत्येक नए ब्राउज़र रिलीज़ के साथ बदलते हैं। अंतिम नोट मेरे पास उन पृष्ठों के साथ बेहतर भाग्य है जो खुद को "ताज़ा" करते हैं (एक और प्रतिक्रिया निर्देश)। ताज़ा कैशे से आने की संभावना कम लगती है।

उम्मीद है की वो मदद करदे।


0

मैं हमारी साइट पर नो-स्टोर टैग को जोड़ने का परीक्षण करने जा रहा हूं, यह देखने के लिए कि क्या यह ब्राउज़र कैशिंग (क्रोम कभी-कभी पृष्ठों को कैशिंग कर रहा है) में अंतर करता है। मुझे यह लेख भी प्रलेखन पर बहुत उपयोगी लगा कि कैसे और क्यों कैशिंग काम करता है और ईटाग के अगले पर दिखेगा यदि कोई दुकान नहीं है:

http://www.mnot.net/cache_docs/

http://en.wikipedia.org/wiki/HTTP_ETag


0

यह भी देखें कि जब उपयोगकर्ता वापस क्लिक करते हैं तो Google इनपुट को मेरे इनपुट्स को कैस करने से कैसे रोकें? जिसके बिना Chrome पुनः लोड हो सकता है लेकिन <input>तत्वों की पिछली सामग्री को संरक्षित कर सकता है - दूसरे शब्दों में, उपयोग करें autocomplete="off"

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