2012-08-05 5 views
6

मैं एमवीसी 4 के साथ उपयोग करने के लिए एक मोंगोडीबी/मेमोरी संयुक्त आउटपुट कैश प्रदाता को लागू करने की कोशिश कर रहा हूं। यहाँ मेरी प्रारंभिक दिया गया है:विशिष्ट नियंत्रक क्रियाओं के लिए कस्टम आउटपुट कैश प्रदाता का चयन

public class CustomOutputCacheProvider : OutputCacheProvider 
{ 
    public override object Get(string key) 
    { 
     FileLogger.Log(key); 
     return null; 
    } 

    public override object Add(string key, object entry, DateTime utcExpiry) 
    { 
     return entry; 
    } 

    public override void Set(string key, object entry, DateTime utcExpiry) 
    { 
    } 

    public override void Remove(string key) 
    { 
    } 
} 

और मेरे वेब config प्रविष्टि:

<caching> 
    <outputCache defaultProvider="CustomOutputCacheProvider"> 
    <providers> 
     <add name="CustomOutputCacheProvider" type="MyApp.Base.Mvc.CustomOutputCacheProvider" /> 
    </providers> 
    </outputCache> 
</caching> 

और HomeController भीतर उपयोग:

[OutputCache(Duration = 15)] 
public ActionResult Index() 
{ 
    return Content("Home Page"); 
} 

मेरे समस्या यह है, जब मैं के लिए लॉगफ़ाइल जाँच जिन चाबियों का अनुरोध किया गया है, मैं न केवल घर नियंत्रक के लिए अनुरोध देखता हूं, बल्कि अन्य सभी पथ भी देखता हूं:

a2/ <-- should only log this entry 
a2/test 
a2/images/test/50115c53/1f37e409/4c7ab27d/50115c531f37e4094c7ab27d.jpg 
a2/scripts/jquery-1.7.2.min.js 

मुझे लगा है कि मुझे कस्टमऑटपुट कैशप्रोवाइडर को वेब में डिफ़ॉल्ट प्रदाता के रूप में सेट नहीं करना चाहिए। कॉनफिग, जो मुझे पता नहीं लगा कि कैश प्रदाता को निर्दिष्ट करना है जिसे मैं एक विशिष्ट नियंत्रक कार्रवाई के लिए उपयोग करना चाहता हूं।

Asp.Net वेब पृष्ठों के साथ

आप पेज के शीर्ष पर <%@ OutputCache Duration="60" VaryByParam="None" providerName="DiskCache" %> का उपयोग करके इसे पूरा कर सकते हैं, लेकिन MVC के लिए एकमात्र समाधान मैं मिल सकता है Global.asax में HttpApplication.GetOutputCacheProviderName Method ओवरराइड करने के लिए है।

क्या [आउटपुट कैश] विशेषता का उपयोग करके इसे पूरा करने का एक और शानदार तरीका है?

+0

एक और सुझाव जोड़ा गया! – bUKaneer

+0

ब्याज से 'ए 2/टेस्ट' क्या है और यह मूल अनुरोध 'ए 2 /' के साथ कैसे फिट है? –

+0

वास्तव में कोई विचार नहीं, मैं जो अनुरोध करता हूं वह है http: // host/test'। एमवीसी ए 2 जोड़ता है (देखें [आउटपुट कैशएट्रिब्यूट सीएस] (http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/98d041ae352f#src%2fSystem.Web.Mvc%2fOutputCacheAttribute.cs)) कुंजी –

उत्तर

5

वहाँ OutputCacheProvider [OutputCache] विशेषता का उपयोग कर स्थापित करने के लिए एक और अधिक सुरुचिपूर्ण रास्ता नहीं है?

मुझे लगता है कि जवाब है नहीं, (अच्छी तरह से वर्तमान mvc4 रिलीज के साथ नहीं) एक कस्टम OutputCacheProvider लागू करने और OutputCache विशेषता के साथ एक कार्रवाई सजाने के बीच कोई संबंध नहीं है के बाद से।

जैसा कि आपने कस्टम प्रदाता को कार्यान्वित करके और लॉगिंग विधि में लॉग इन करके देखा है, आप वेब सर्वर पर किए गए प्रत्येक अनुरोध को देखते हैं। यदि आप अपने सभी कार्यों से OutputCache विशेषता को हटाना चाहते हैं तो भी आप लॉग फ़ाइल में प्रत्येक अनुरोध को देखेंगे। मैंने सोचा कि इस ASP.NET MVC hits outputcache for every action का उत्तर इसकी पुष्टि करने के लिए बहुत उपयोगी था।

के बाद से ऐसा लगता है कि आप केवल एक उत्पादन-कैश प्रदाता लागू करना चाहते हैं तो मुझे लगता है कि अपने ही एकमात्र विकल्प को नहीं डिफ़ॉल्ट प्रदाता की स्थापना की और GetOutputCacheProviderName कार्यान्वयन ओवरराइड करने के लिए (के रूप में आप पहले से ही उल्लेख किया है) के लिए जारी है।शायद कुछ इस तरह सभी सामग्री, बाहर करने के लिए छवियाँ और स्क्रिप्ट

public override string GetOutputCacheProviderName(HttpContext context) 
{ 
    string absolutePath = context.Request.Url.AbsolutePath; 

    if (absolutePath.StartsWith("/Content/", StringComparison.CurrentCultureIgnoreCase) 
     || absolutePath.StartsWith("/Scripts/", StringComparison.CurrentCultureIgnoreCase) 
     || absolutePath.StartsWith("/Images/", StringComparison.CurrentCultureIgnoreCase)) 
     return base.GetOutputCacheProviderName(context); 

    return "CustomOutputCacheProvider"; 
} 

आप एक से अधिक उत्पादन-कैश प्रदाता को लागू करने की तो मुझे लगता है कि आप एक सहायक को लागू करने देने के लिए होगा की जरूरत है आप सही प्रदाता नाम। लेकिन यहां एक उदाहरण दिया गया है जहां मैंने आपके लिए रूटिंग डेटा हल कर लिया है; जहां पिछला उदाहरण सीधे यूआरएल पर देखा गया था।

public override string GetOutputCacheProviderName(HttpContext context) 
{  
    RouteCollection rc = new RouteCollection(); 
    MvcApplication.RegisterRoutes(rc); 
    RouteData rd = rc.GetRouteData(new HttpContextWrapper(HttpContext.Current)); 

    if (rd == null) 
     return base.GetOutputCacheProviderName(context); 

    var controller = rd.Values["controller"].ToString(); 
    var action = rd.Values["action"].ToString(); 

    if (controller.Equals("Content", StringComparison.CurrentCultureIgnoreCase) 
     || controller.Equals("Scripts", StringComparison.CurrentCultureIgnoreCase) 
     || controller.Equals("Images", StringComparison.CurrentCultureIgnoreCase)) 
     return base.GetOutputCacheProviderName(context); 

    if (controller.Equals("Account", StringComparison.CurrentCultureIgnoreCase)) 
     return "AccountOutputCacheProvider"; 
    if (controller.Equals("Something", StringComparison.CurrentCultureIgnoreCase)) 
     return controller + "OutputCacheProvider"; 

    return "CustomOutputCacheProvider"; 
} 
+0

वह उत्तर नहीं जिसे मैं ढूंढ रहा था, लेकिन लिंक ने मदद की। ऐसा लगता है कि मुझे अपना खुद का समाधान लागू करना होगा। –

1

मैं जहां, मैं MyOutputCachAttribute OutputCachAttribute से विरासत में मिली है कि इसकी पैरामीटर द्वारा प्रदाता का चयन करेंगे लिखने की कोशिश होगी।

+0

जांचना चाहते हैं, मैंने इसे माना है, लेकिन ऐसा लगता है कि यह मेरे स्वयं के कैशिंग तंत्र को लागू करने के लिए लगभग बराबर नौकरी की तरह लगता है। [आउटपुट कैशएट्रिब्यूट.cs] देखें (http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/98d041ae352f#src%2fSystem.Web.Mvc%2fOutputCacheAttribute.cs) –

0

चेक MSDN पत्रिका से इस लेख (स्रोत कोड और उदाहरण MongoDB & Azure वितरित कैश प्रदाताओं के रूप में संदर्भित) के साथ अच्छी तरह से कुछ अंतर्दृष्टि प्रदान कर सकता http://msdn.microsoft.com/en-us/magazine/gg650661.aspx

संपादित

आप CacheProfile निर्दिष्ट करने के लिए की स्थापना का उपयोग कर सकते जैसा कि यहां सुझाया गया प्रदाता?

http://www.dotnetcurry.com/ShowArticle.aspx?ID=665

+0

धन्यवाद, पहले से ही इसे देखा गया है, यह वही समस्या है। –

+0

दुर्भाग्य से, कैशप्रोफाइल में सेट प्रदाता सेटिंग नहीं है। –

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