2010-11-02 9 views
6

मैं एक एएसपी.नेट एमवीसी अनुप्रयोग विकसित कर रहा हूं। अधिकांश नियंत्रक कार्यों को कैश नहीं किया जाना चाहिए। क्योंकि यह मैं उत्पादन नहीं-कैश Application_BeginRequest हैडर:एमवीसी अनुरोधों के लिए कैशिंग को कैसे बंद करें लेकिन आईआईएस 7 में स्थिर फाइलों के लिए नहीं?

protected void Application_BeginRequest() 
    { 
     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(); 
    } 

आवेदन मॉड्यूल config की स्थापना runAllManagedModulesForAllRequests="true" साथ IIS7 पर चल रहा है। इसका मतलब है कि सभी स्थिर फाइलें अनुरोध पाइपलाइन के माध्यम से भी गुजरती हैं (और कैशिंग अक्षम हो जाती हैं)।

इन स्थिर फ़ाइलों के लिए कैशिंग सक्षम रखने का सबसे अच्छा तरीका क्या है? क्या मुझे Application_BeginRequest में प्रतिक्रिया कैश हेडर सेट करने से पहले विस्तार पर जांच करनी है या क्या कोई आसान तरीका है (जैसे स्थैतिक फ़ाइलों के लिए अनुरोध पाइपलाइन को पूरी तरह से छोड़ना)?

+2

यह आशाजनक लग रहा है http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html –

उत्तर

3

मान लें कि आप हेक्टर के लिंक में runAllManagedModulesForAllRequests="true" का उपयोग करने से नहीं बच सकते हैं, तो आप अनुरोध हैंडलर के प्रकार की जांच कर सकते हैं और केवल एमवीसी द्वारा अनुरोध किए जा रहे हैं तो कैशिंग हेडर सेट कर सकते हैं।

protected void Application_PreRequestHandlerExecute() 
{ 
    if (HttpContext.Current.CurrentHandler is MvcHandler) 
    { 
     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(); 
    } 
} 

ध्यान दें कि मैं क्योंकि हैंडलर अभी तक BeginRequest में नहीं चुना गया है Application_PreRequestHandlerExecute में कोड स्थानांतरित कर दिया है, इसलिए HttpContext.Current.CurrentHandler रिक्त है।

+0

यह अच्छी तरह से काम करता है। यह आपको अन्य कथन में स्थैतिक फ़ाइलों के लिए कस्टम कैश नियंत्रण सेट करने की अनुमति देता है। – Carvellis

3

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

संभव [CacheFilter]:

using System; 
using System.Web; 
using System.Web.Mvc; 

    public class CacheFilterAttribute : ActionFilterAttribute 
    { 

     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 

      cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
      cache.SetValidUntilExpires(false); 
      cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
      cache.SetCacheability(HttpCacheability.NoCache); 
      cache.SetNoStore(); 
     } 
    } 

के रूप में एक अलग रूप में तुम भी अपने स्टैटिक फ़ाइलें किसी भिन्न डोमेन से, उद्धार की तरह अतः sstatic.net के साथ कर सकता है, जिसमें एक पक्ष प्रभाव के रूप में आपकी समस्या को खत्म करेगा।

संबंधित मुद्दे