2011-08-17 12 views
19

पर साइट-व्यापी नो-कैश हेडर कैसे जोड़ूं, मैंने एक एमवीसी 3 ऐप बनाया है, आवेदकॉन के पास बहुत सारे पेज हैं, क्योंकि सुरक्षा समस्याएं मुझे http हेडर में नो-कैश सेटअप जोड़ने की आवश्यकता है, है ऐसा करने का कोई आसान तरीका? अगर हम एक स्थान को संशोधित कर सकते हैं तो यह पूरे आवेदन के लिए काम करेगा, यह सही होगा।मैं एमवीसी 3 ऐप

क्या आप लोग मेरी मदद कर सकते हैं?

+0

मैं 'Response.Cache.SetCacheability उपयोग करने के लिए मेरा उत्तर संपादित कर लिया है()' बजाय हेडर मैन्युअल स्थापित करने की विधि। फिडलर में परीक्षण किया और उम्मीद के रूप में काम किया। – Marko

उत्तर

29

कैसे में Application_PreSendRequestHeaders घटना अंदर हेडर की स्थापना Global.asax के बारे में?

संपादित आप हेडर सीधे स्थापित करने के बजाय Response.Cache.SetCacheability उपयोग कर सकते हैं। *

void Application_PreSendRequestHeaders(Object sender, EventArgs e) 
{ 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
} 

फ़िडलर में परीक्षण किया गया। हेडर मैन्युअल स्थापना करके


वैकल्पिक तरीका है।

void Application_PreSendRequestHeaders(Object sender, EventArgs e) { 
    Response.Headers.Set("Cache-Control", "no-cache"); 
} 
+11

वह तरीका बहुत ज्यादा कैशिंग नहीं है! यदि आप ऐसा करते हैं तो आप सभी जावास्क्रिप्ट, सीएसएस, आइकन इत्यादि को कैश नहीं करेंगे और अपनी बैंडविड्थ और प्रतिक्रिया पर काफी संख्या में काम करेंगे। –

+0

@ScottStafford ओपी अनुरोध को पढ़ें "अगर हम एक स्थान को संशोधित कर सकते हैं तो यह पूरे आवेदन के लिए काम करेगा, यह सही होगा।" जाहिर है, कुछ फाइलों को फ़िल्टर किया जा सकता है लेकिन यह अनुरोध नहीं किया गया था। – Marko

+3

मुझे पता है कि उसने कहा था। मैंने -1 या कुछ भी नहीं किया, लेकिन मैं यह सुनिश्चित करना चाहता था कि वह (और किसी भी अन्य पाठकों) को पता चले कि इतने भारी हाथों के दृष्टिकोण क्या हैं। "यह एक एएसपीएक्स फ़ाइल है" के लिए एक परीक्षण में फेंको और यह अधिक व्यापक रूप से लागू है। –

1

मैं आईआईएस अपने आप में यह करना होगा (आपको लगता है कि प्रयोग कर रहे हैं यह सोचते हैं), या web.config:

<configuration> 
    <system.webServer> 
     <staticContent> 
     <clientCache cacheControlMode="DisableCache" /> 
     </staticContent> 
    </system.webServer> 
</configuration> 

कम कोड बेहतर कोड है।

सेटअप आईआईएस के संस्करण के आधार पर थोड़ा अलग है।

अधिक जानकारी के लिए here देखें।

+0

क्या यह कॉन्फ़िगरेशन केवल स्थिर सामग्री (आईएमजी, जेएस, सीएसएस, आदि) पर लागू होता है, या नाम सिर्फ थोड़ा भ्रामक है? यह आईआईएस वेबसाइट से काफी स्पष्ट नहीं है। –

+0

@ ट्रॉय - मैं * सोचता हूं * यह सब कुछ है। परीक्षण करने में बहुत आसान है, फिडलर/फायरबग/आदि में प्रतिक्रिया शीर्षलेखों की जांच करें – RPM1984

+2

एप्लिकेशन से कैश नियंत्रित करना मेरे लिए अधिक उपयुक्त लगता है, क्योंकि मुझे उम्मीद है कि ज्यादातर लोग स्थैतिक सामग्री के कैशिंग चाहते हैं। साथ ही, मैं नहीं कहूंगा कि आपके समाधान को कम कोड की आवश्यकता है :-)। – theDmi

1

मैं अनुशंसा करता हूं कि जीईटी पर कैश के लाभ को खोने से बचने के लिए ये कॉल गैर-जीईटी अनुरोधों तक ही सीमित हों। निम्नलिखित यह सुनिश्चित करता है कि आईओएस 6 सफारी जैसे आक्रामक कैशिंग ब्राउज़र भी कुछ भी कैश नहीं करेंगे जो जीईटी अनुरोध नहीं है।

मैं एक नियंत्रक बेस क्लास का उपयोग करता हूं जो मेरे सभी नियंत्रकों को कई कारणों से प्राप्त होता है, और यह अच्छी तरह से सेवा करता है कि मेरा प्रारंभिक ओवरराइड मेरे कैशिंग हेडर को सशर्त रूप से सेट करने में संभाल सकता है। उन चाहने विधि/कार्रवाई या वर्ग/नियंत्रक विस्तृत no-cache

[OutputCache(Location = OutputCacheLocation.None)] 
public class HomeController : Controller 
{ 
... 
} 

के रूप में के लिए

public class SmartController : Controller 
{ 
    ... 
    public HttpContextBase Context { get; set; } 

    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     Context = requestContext.HttpContext; 

     if (Context.Request.RequestType != "GET") 
     { 
      Context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     } 

     base.Initialize(requestContext); 
     ... 
    } 
... 
} 
+0

HTTP क्रिया के आधार पर कैश नीति सेट करना विभिन्न प्रकार के ऐप्स के लिए पर्याप्त नहीं होगा। आइए मान लें कि आपके पास एक पृष्ठ है जहां आप अस्पताल रोगी डेटा लोड करने के लिए जीईटी और क्वेरीस्ट्रिंग का उपयोग करते हैं? आप नहीं चाहते कि वह पृष्ठ कैश किया गया हो। –

+0

लैरी, उस स्थिति में आप निश्चित रूप से आधार नियंत्रक तर्क को लागू नहीं करना चाहते हैं जैसा मैंने यहां सुझाया है। :) –

13

वैकल्पिक यहां विस्तार से बताया:

OutputCacheLocation Enumeration

कोई नहीं: उत्पादन कैश के लिए अक्षम किया गया है अनुरोधित पृष्ठ। यह मान HttpCacheability.NoCache गणना मान से मेल खाता है।

HttpCacheability Enumeration

NoCache - सेट कैश-नियंत्रण: नहीं कैश हेडर ....

+0

एएसपी.नेट आउटपुट कैश नो-कैश HTTP हेडर जैसा नहीं है, जो ओपी पूछ रहा है। –

+0

@ माइकमैरीनोस्की हां लेकिन क्या आप निश्चित हैं? मेरा मानना ​​है कि किसी का मतलब न तो सर्वर और न ही क्लाइंट है और क्लाइंट – KCD

+0

["कोई नहीं: \t के लिए कैश-कंट्रोल: नो-कैश" हेडर का उत्पादन करता है [अनुरोध किया गया पृष्ठ के लिए आउटपुट कैश अक्षम है। यह मान HttpCacheability से मेल खाता है। । "] (http://msdn.microsoft.com/en-us/library/system.web.ui.outputcachelocation (v = vs.100) .aspx) ... [" NoCache - कैश-कंट्रोल सेट करता है: नो-कैश हेडर .... "] (http://msdn.microsoft.com/en-us/library/system.web.httpcacheability (v = vs.100) .aspx) – KCD

2

एक वैश्विक फ़िल्टर सेट अप करें।

public class MvcApplication : System.Web.HttpApplication 
{ 

    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new NoCacheGlobalActionFilter()); 
    }  
} 

public class NoCacheGlobalActionFilter : ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
     cache.SetCacheability(HttpCacheability.NoCache); 

     base.OnResultExecuted(filterContext); 
    } 
} 

http://dotnet.dzone.com/articles/output-caching-aspnet-mvc