2012-07-25 10 views
5

क्या सत्र में कुछ मानों के आधार पर एमवीसी में आउटपुट कैश को बदलना संभव है? मैंने difbyby कस्टम कार्यक्षमता का उपयोग करने और Global.asax में GetVaryByCustomString को ओवरराइड करने के बारे में बहुत कुछ पढ़ा है लेकिन सत्र इस समय उपलब्ध नहीं है।सत्र मूल्यों के आधार पर एमवीसी आउटपुट कैश

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom == "somekey") 
     //Want to check the session here (but it isn't available). 

    return base.GetVaryByCustomString(context, custom); 
} 

मुझे समझ में आता है क्योंकि सत्र बाद में अनुरोध पाइपलाइन में नहीं बनाया गया है।

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

कारण यूआरएल एक ही है कि उपयोगकर्ता, एक 'अतिथि' के रूप में में आता है कुछ जानकारी (बाद का) में प्रवेश करती है, यह सत्यापित और सत्र में संग्रहीत किया जाता है और फिर वे कर रहे हैं वापस एक ही पृष्ठ पर री-डायरेक्ट है (जो अब सत्र डेटा के आधार पर उपयोगकर्ता के लिए विशिष्ट होना चाहिए)।

पृष्ठ को स्वयं सामान्य रूप से कैश किया जाना चाहिए क्योंकि यदि कोई 'अतिथि' एक ही यूआरएल पर जाता है, तो उसे हर बार एक ही 'मानक' पृष्ठ पर कार्य करना चाहिए।

इस तरह से कैशिंग को बदलना संभव है?

उत्तर

0

क्या Output Cache ActionFilter मदद करेगा?

या शायद आप लेआउट पेज में अपने विचार को पुन: सक्रिय कर सकते हैं और अज्ञात और प्रमाणित अनुभागों के आंशिक दृश्यों का उपयोग कर सकते हैं, फिर Partial Caching का उपयोग करें।

0

आपको "डोनट कैशिंग" में देखना चाहिए, लेकिन यह कम से कम बॉक्स से बाहर नहीं, एएसपी.नेट एमवीसी 3 द्वारा समर्थित नहीं है। सौभाग्य से किसी को पहले से ही इस समस्या का समाधान आप MvcDonutCaching

देखने के लिए मैंने पढ़ा है कि ASP.NET MVC 4 बॉक्स से बाहर "डोनट छेद कैशिंग" शामिल होंगे, लेकिन मैं नहीं कर सकते अगर यह मौजूदा आर सी में है या नहीं बताओ।

2

यदि आप प्रति उपयोगकर्ता कैश आउटपुट को वैयक्तिकृत करना चाहते हैं, तो बेहतर है कि आप स्थान को OutputCacheLocation.Client पर नीचे सेट करें। अधिक जानकारी here

[OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)] 
    public string GetName() 
    { 
     return "Hi " + User.Identity.Name; 
    } 
संबंधित मुद्दे