2017-07-11 12 views
10

के लिए एक ही सामग्री कैश करने के लिए मैं अपने MVC नियंत्रक में निम्न कोड है:उपयोग OutputCache और GetVaryByCustomString अनेक पथों

[HttpGet] 
[OutputCache(Duration = 3600, VaryByParam = "none", VaryByCustom = "app")] 
public async Task<ViewResult> Index(string r) 
{ 
    // Stuff... 
} 

और मैं है मेरी Global.asax.cs कक्षा में GetVaryByCustomString के निम्नलिखित कार्यान्वयन:

public override string GetVaryByCustomString(HttpContext context, string arg) 
{ 
     switch (arg.ToLower()) 
     { 
      case "app": 
       return context.Request.Url.Host; 

      default: 
       return base.GetVaryByCustomString(context, arg); 
     } 
    } 

हमारे आवेदन में, ग्राहकों को अपने स्वयं उप डोमेन होगा (यानी johndoe.app.com, janedoe.app.com)।

तो कैशिंग को सबडोमेन पर अलग-अलग होना चाहिए।

हालांकि, उस पूरी तरह से योग्य यूआरएल पर किसी भी "पथ" को एक ही कैश साझा करना चाहिए।

  • johndoe.app.com/
  • johndoe.app.com/123
  • johndoe.app.com/abc

नहीं है एक: तो एक ही आउटपुट कैश पढ़ना चाहिए निम्नलिखित थकाऊ कारण यह क्यों है, लेकिन संक्षेप में, यह एक एसपीए ऐप है, और "पथ" वास्तव में सिर्फ एक ट्रैकर है। इसे एक क्वेरी स्ट्रिंग में बदला नहीं जा सकता है।

जब पथ (ट्रैकर) बदलता है, तो अनुक्रमणिका विधि को ताज़ा रूप से एक्सेस किया जाता है। मैं इसे डीबगर के माध्यम से बता सकता हूं। एक नोट के रूप में, GetVaryByCustomString अभी भी कहा जाता है, लेकिन इसे इंडेक्स विधि संसाधित करने के बाद कहा जाता है।

मैं सबडोमेन के आधार पर कैश कैसे बदल सकता हूं, लेकिन यूआरएल पर पथ (ट्रैकर) पर ध्यान दिए बिना उस कैश का उपयोग कैसे करें?

यह कुछ भी लाभप्रद प्रदान करता है, तो यहां मेरी MVC मार्गों है:

routes.MapRoute(
      name: "Tracker", 
      url: "{r}", 
      defaults: new { controller = "Home", action = "Index", id = "" }); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

MVC संस्करण 5.2.3, .NET 4.6.1

+0

मैं अगर यह काम यकीन नहीं है, लेकिन आप एक कस्टम फिल्टर के रूप में GetVaryByCustomString को लागू नहीं कर सकते अगर आप इसे होना चाहते हैं सूचकांक कार्रवाई से पहले निष्पादित ?? –

+0

@RAHULSR मुझे ऐसा नहीं लगता है। आपको इसे Global.asax.cs में ओवरराइड करना होगा। मैं एक कस्टम कैशिंग समाधान लागू कर सकता हूं, जिसमें एक्शन फ़िल्टर, या ग्लोबल वेब हैंडलर, या कुछ ऐसा शामिल है, लेकिन यह आदर्श नहीं होगा। – contactmatt

+0

इसे नियंत्रक के कन्स्ट्रक्टर में डालने के बारे में कैसे जोड़ें ?? कृपया अपना उत्तर भी साझा करें मैं अब थोड़ा उत्सुक हूं –

उत्तर

1

आप का उपयोग करने की कोशिश की: VaryByHeader = "होस्ट" ?

[HttpGet] 
[OutputCache(Duration = 3600, VaryByHeader = "Host")] 
public async Task<ViewResult> Index(string r) 
{ 
    // Stuff... 
} 

अधिक जानकारी कैसे अलग अलग तरीकों से यह करने के लिए आप यहाँ पा सकते हैं:

Output cache for multi-tenant application, varying by hostname and culture

+0

होस्ट द्वारा वेरी सबडोमेन और इसी तरह के बदलाव के लिए अच्छा है। लेकिन यह एक ही डोमेन, प्रोटोकॉल, आदि है, पथों में बस एक भिन्नता है। – contactmatt

+0

आप इसे प्राप्त नहीं करते हैं क्योंकि सब कुछ उपरोक्त सबडोमेन आपके एसपीए अनुप्रयोग नियंत्रकों द्वारा नियंत्रित होता है। यदि आपने सबडोमेन के बाद भागों को कैश किया था तो इसका मतलब यह होगा कि आप अपने एसपीए एप्लिकेशन से यूआरएल को नियंत्रित नहीं कर पाएंगे। –

+0

@contactmatt मुझे ऐसा समाधान मिला: https://techblog.dorogin.com/using-html5-appcache-with-single-page-applications-dc64f81e6b7e। क्या आप फीडबैक भेज सकते हैं? –

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