संपूर्ण ASP.NET वेबसाइट के लिए ब्राउज़र कैश अक्षम करें


199

मैं पूरी ASP.NET MVC वेबसाइट के लिए ब्राउज़र कैश को अक्षम करने के लिए एक विधि की तलाश कर रहा हूं

मुझे निम्न विधि मिली:

Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();

और यह भी एक मेटा टैग विधि (यह मेरे लिए काम नहीं करेगा, क्योंकि कुछ एमवीसी क्रियाएं आंशिक HTML / JSON को अजाक्स के माध्यम से, बिना सिर, मेटा टैग के भेजती हैं)।

<meta http-equiv="PRAGMA" content="NO-CACHE">

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


जवाबों:


92
HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();

सभी अनुरोध पहले default.aspx के माध्यम से रूट किए जाते हैं - इसलिए मान लें कि आप वहां के पीछे कोड में पॉप कर सकते हैं।


17
मैं इसे Application_BeginRequest () में Global.asax.cs में डालूँगा। मैं इस default.aspx बात पर भरोसा नहीं करता ... एक और सवाल: क्या यह [OutputCache] विशेषताओं पर पूर्वता है?
chris166

5
मुझे एक ग्लोबल एक्शन फ़िल्टर बनाने का विचार पसंद है जो इस तरह से एक सामान बना रहा है। Default.aspx और Global.asax के बारे में चिंता करने की आवश्यकता को नकारता है।
कीथ एडलर

13
Application_BeingRequest में इसे डालने से कुछ समस्याएं हो सकती हैं। यदि आपकी छवियों को .net रनटाइम के माध्यम से रूट किया जाता है (जो तब हो सकता है जब आप वाइल्डकार्ड का उपयोग अच्छे यूआरएल के लिए कर रहे हों) तो ब्राउज़र पर कोई भी चित्र कैश नहीं किया जाएगा। यह वास्तव में आपके पृष्ठ लोड समय को धीमा कर सकता है क्योंकि प्रत्येक पृष्ठ अनुरोध सभी छवियों को फिर से डाउनलोड करेगा।
जड़ी

4
प्रोग्रामेटिक रूप से किसी भी चीज़ का उपयोग करना हमेशा किसी घोषित गुण को ओवरराइड करेगा। दूसरे शब्दों में, ओपी कोड का उपयोग किसी भी घोषित [OutputCache] विशेषता को ओवरराइड करेगा।
डेव ब्लैक

कैसे धूम्रपान परीक्षण और सत्यापित करें कि कैश अक्षम वास्तव में काम कर रहा है पर कोई विचार?
पाँव

366

एक वर्ग बनाएं जो IActionFilter से विरासत में मिले।

public class NoCacheAttribute : ActionFilterAttribute
{  
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        base.OnResultExecuting(filterContext);
    }
}

फिर जहां जरूरत हो वहां खूबियां लगाएं ...

[NoCache]
[HandleError]
public class AccountController : Controller
{
    [NoCache]
    [Authorize]
    public ActionResult ChangePassword()
    {
        return View();
    }
}

19
HttpContext.Current.Response के बजाय, आपको शायद HttpContext के बाद filterContext.HttpContext.Response का उपयोग करना चाहिए। वर्तमान में MVC HttpContext ऑब्जेक्ट और filterContext.ttpContext ऑब्जेक्ट लौटाता है। यह परीक्षण क्षमता और निरंतरता बढ़ाता है।
mkedobbs 20

5
IActionFilter ActionFilterAttribute पर पहले से ही लागू है, इसलिए आपको इसे दोहराने की आवश्यकता नहीं है।
एंड्रयू डेवी

104
ASP.NET MVC के वर्तमान संस्करणों में आप कैशिंग को रोकने के लिए केवल OutputCacheAttribute का उपयोग कर सकते हैं: [OutputCache (NoStore = true, Duration = 0, VaryByParam = "none")]
Ashley

9
मैं यह बताना चाहूंगा कि मैंने इस सवाल के स्वीकृत जवाब सहित ASP.NET MVC के लिए सूरज के नीचे "कैशिंग को रोकने के लिए अपने कोड में प्रत्येक" का उपयोग करते हुए कई दिन बिताए। यह जवाब - विशेषता - काम किया। + 1M रेप अगर मैं कर सका ...
टॉम किड

5
आप if (filterContext.IsChildAction) return;शीर्ष पर जोड़ना चाह सकते हैं - यह बाहरी क्रिया को 'नो कैशेड' होने से रोकेगा यदि यह एक चाइल्ड एक्शन कहलाता है जिसे NoCacheविशेषता के साथ सजाया गया है। NoCacheयदि वे बाल क्रियाओं को निष्पादित करते हैं, तो दूसरे शब्दों में विशेषता अन्य कार्यों के लिए लीक नहीं होगी। इसके अलावा, वर्ग का नाम NoCacheAttributeविशेषताओं के लिए आम तौर पर स्वीकृत नामकरण सम्मेलन का पालन करने के लिए होना चाहिए ।
जैकब कोनकी

132

अपने स्वयं के रोल करने के बजाय, बस आपके लिए जो प्रदान किया गया है उसका उपयोग करें।

जैसा कि पहले उल्लेख किया गया है, सब कुछ के लिए कैशिंग को अक्षम न करें। उदाहरण के लिए, ASP.NET MVC में भारी उपयोग की जाने वाली jQuery स्क्रिप्ट्स को कैश किया जाना चाहिए। वास्तव में आदर्श रूप में आपको उन लोगों के लिए सीडीएन का उपयोग करना चाहिए , लेकिन मेरी बात यह है कि कुछ सामग्री को कैश किया जाना चाहिए।

मुझे लगता है कि यहाँ पर सबसे अच्छा काम करने के बजाय [OutputCache] को छिड़कना एक वर्ग का उपयोग करना है:

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class NoCacheController  : Controller
{
}

आपके सभी नियंत्रक आप इस नियंत्रक से विरासत के लिए कैशिंग अक्षम करना चाहते हैं।

यदि आपको NoCacheController वर्ग में चूक को ओवरराइड करने की आवश्यकता है, तो बस अपने एक्शन विधि पर कैश सेटिंग्स निर्दिष्ट करें और आपके एक्शन विधि पर सेटिंग्स पूर्ववर्ती हो जाएंगी।

[HttpGet]
[OutputCache(NoStore = true, Duration = 60, VaryByParam = "*")]
public ViewResult Index()
{
  ...
}

4
@Ozziepeeps, आपकी टिप्पणी सही नहीं है। Msdn डॉक्स ब्राउज़र कैशिंग के साथ-साथ एक साधारण परीक्षण पर चर्चा करते हैं, यह विशेषता दिखाएगा कि कैश-कंट्रोल रिस्पॉन्स हेडर को "कैश-कंट्रोल: पब्लिक, नो-स्टोर, अधिकतम आयु = 0" से "कैश-कंट्रोल: प्राइवेट" बिना बदले विशेषता का उपयोग करना।
एडम तुलिपर - MSFT

2
भी फी - आप इस विशेषता के साथ सभी तीन स्थानों (सर्वर, प्रॉक्सी, क्लाइंट) को नियंत्रित कर सकते हैं ताकि सर्वर कैश से परे पूरी तरह से नियंत्रित कर सकें। देखें asp.net/mvc/tutorials/... कुछ अतिरिक्त जानकारी के लिए।
एडम ट्यूलिपर - MSFT

1
+1 "यदि आपको NoCacheController क्लास में डिफॉल्ट्स को ओवरराइड करने की आवश्यकता है, तो बस अपने एक्शन मेथड पर कैशे सेटिंग को निर्दिष्ट करें और आपके एक्शन मेथड पर सेटिंग्स पूर्ववर्ती हो जाएंगी।"
कोरायेम

2
कृपया ध्यान दें कि यदि आप [System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]कक्षा स्तर पर उपयोग करते हैं , तो आपकी कक्षा में आंशिक दृश्य नहीं हो सकते हैं।
विवियन नदी

1
आउटपुटकैच विधि ने IE कैशिंग को नहीं रोका जब दो स्थितियां मौजूद थीं: 1) कार्रवाई ने कोई पैरामीटर नहीं लिया और 2) कार्रवाई केवल सामग्री (someText) के माध्यम से पाठ लौटाती है। जब मैं JSON लौटाता हूं और एक पैरामीटर लेता हूं, तो IE कैशिंग ठीक से हार जाता है।
कासे स्पीकमैन

10

आप नियंत्रकों (यानी HTML पृष्ठों) द्वारा प्रदान किए गए सभी पृष्ठों के लिए ब्राउज़र कैशिंग को अक्षम करना चाह सकते हैं, लेकिन स्क्रिप्ट, शैली पत्रक और छवियों जैसे संसाधनों के लिए कैशिंग रखें । यदि आप MVC4 + बंडलिंग और मिनिफिकेशन का उपयोग कर रहे हैं, तो आप स्क्रिप्ट और स्टाइलशीट के लिए डिफ़ॉल्ट कैश अवधि रखना चाहते हैं (बहुत लंबी अवधि, क्योंकि कैश एक अद्वितीय URL में परिवर्तन के आधार पर अमान्य हो जाता है, समय पर आधारित नहीं)।

MVC4 + में, सभी नियंत्रकों में ब्राउज़र कैशिंग को अक्षम करने के लिए, लेकिन किसी नियंत्रक द्वारा सेवा नहीं की गई किसी भी चीज़ के लिए इसे बनाए रखें, इसे इसमें जोड़ें FilterConfig.RegisterGlobalFilters:

filters.Add(new DisableCache());

DisableCacheनिम्नानुसार परिभाषित करें :

class DisableCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}

दुर्भाग्य से यह काम करने के लिए प्रकट नहीं होता है, क्योंकि साइन आउट करने के बाद पृष्ठ को प्रदर्शित करने के बाद बैक बटन को मारना।
ᴍᴀᴛᴛ ᴍᴀᴛᴛ

6

मुझे पता है कि यह उत्तर प्रश्न से संबंधित 100% नहीं है, लेकिन यह किसी की मदद कर सकता है।

यदि आप पूरी ASP.NET MVC वेबसाइट के लिए ब्राउज़र कैश को अक्षम करना चाहते हैं , लेकिन आप केवल यह TEMPORARILY करना चाहते हैं, तो अपने ब्राउज़र में कैश को अक्षम करना बेहतर है।

यहाँ क्रोम में एक स्क्रीनशॉट है


यह वही है जो मैं देख रहा था ... देव के दौरान, अगर मैं एक .js फ़ाइल को बदलता हूं, तो यह एक बड़ी पीड़ा है कि मुझे थोड़ा परेशानी / ताज़ा / परीक्षण चक्र करने में परेशानी होने पर तुरंत आने के लिए। यह बिल्कुल सही है, धन्यवाद! बस मेरे क्लाइंट की ओर से डिबगिंग जीवन को बहुत आसान बना दिया
jleach

2

मैंने पिछले सभी उत्तरों को लागू किया और अभी भी एक दृष्टिकोण था जो सही ढंग से काम नहीं करता था।

यह देखने का नाम निकला कि मुझे जिस समस्या का सामना करना पड़ रहा था उसका नाम 'हाल' था। जाहिरा तौर पर यह इंटरनेट एक्सप्लोरर ब्राउज़र को भ्रमित करता है।

जब मैंने व्यू नेम (कंट्रोलर में) बदलकर एक अलग नाम (मैंने 'हाल 5' को चुना) के बाद, ऊपर दिए गए समाधान काम करने लगे।


0

आप Global.asax फ़ाइल में कोड के नीचे कोशिश कर सकते हैं।

protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
    }

-1

यूआई

<%@ OutPutCache Location="None"%>
<%
    Response.Buffer = true;
    Response.Expires = -1;
    Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
    Response.CacheControl = "no-cache";
%>

पृष्ठभूमि

Context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Expires = -1;          
Response.Cache.SetNoStore();

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