2010-01-17 10 views
5

क्या अज्ञात उपयोगकर्ताओं के लिए केवल ASP.NET पूरे पृष्ठ को कैश करने का कोई आसान तरीका है (प्रयुक्त प्रमाणीकरण प्रपत्र)?अज्ञात उपयोगकर्ताओं के लिए कैश ASP.NET पृष्ठ केवल

प्रसंग: मैं एक वेबसाइट है, जहां अज्ञात उपयोगकर्ताओं को प्रदर्शित पृष्ठों ज्यादातर पूरी तरह से स्थिर हैं बना रही हूँ, लेकिन एक ही पृष्ठों के लिए लॉग-इन उपयोगकर्ता नहीं हैं प्रदर्शन किया।

बेशक मैं इस हाथ से कोड के माध्यम से पीछे क्या कर सकते हैं, लेकिन मैंने सोचा था कि एक बेहतर/आसान/तेज़ तरीका हो सकता है।

+0

क्या आपको कभी इस समस्या का समाधान मिला है? हमारे पास एक समान आवश्यकता है जो अलग-अलग है, कस्टम का जवाब नहीं है। –

+0

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

+0

क्या आप अपना कोडबींड समाधान साझा कर सकते हैं? आप इस तरह कैश को कैसे नियंत्रित करते हैं? –

उत्तर

1

आप VaryByCustom इस्तेमाल कर सकते हैं, और username की तरह एक कुंजी का उपयोग करें।

+0

इसके साथ समस्या यह है कि यह लॉग-इन उपयोगकर्ताओं को भी प्रदर्शित पृष्ठों को कैश करेगा। मेरे मामले में, वे पृष्ठ पहले ही आंशिक रूप से कैश किए गए हैं, जबकि कुछ हिस्सों को कैश नहीं किया जा सकता है (यहां तक ​​कि एक ही उपयोगकर्ता के लिए)। बेशक, यदि उपयोगकर्ता लॉग इन है तो मैं VaryByCustom कुंजी को यादृच्छिक मान पर सेट कर सकता हूं, लेकिन इसमें बड़े प्रदर्शन समस्याएं होंगी। –

3

मैं asp.net MVC का उपयोग कर रहा है, इसलिए मैं अपने नियंत्रक में ऐसा किया

if (User.Identity.IsAuthenticated) { 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 
    Response.Cache.SetNoStore(); 
    Response.Cache.SetNoServerCaching(); 
} 
else { 
    Response.Cache.VaryByParams["id"] = true; // this is a details page 
    Response.Cache.SetVaryByCustom("username"); // see global.asax.cs GetVaryByCustomString() 
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); 
    Response.Cache.SetCacheability(HttpCacheability.Server); 
    Response.Cache.SetValidUntilExpires(true); 
} 

कारण मैं इसे इस तरह से (बजाय एलान के तौर पर की) मैं भी क्षमता की जरूरत इसे चालू करने के था और कॉन्फ़िगरेशन के माध्यम से बंद (यहां नहीं दिखाया गया है, लेकिन मेरे कॉन्फ़िगर चर के लिए अगर कोई अतिरिक्त जांच है)।

तुम अब भी उपयोगकर्ता नाम के हिसाब से बदलती जरूरत है, और आप इस कोड को जब एक लॉग इन उपयोगकर्ता प्रकट होता है में निष्पादित नहीं होगा। मेरा GetVaryByCustomString फ़ंक्शन "अज्ञात" लौटाता है जब प्रमाणित नहीं होता है या उपयोगकर्ता नाम उपलब्ध होने पर नाम देता है।

+0

धन्यवाद, यह मेरे लिए चमत्कार काम करता है। – Dusda

1

वांछित व्यवहार के साथ मौजूदा विशेषता विस्तार से आप को रोकने के कुछ भी नहीं है,

उदाहरण के लिए

:

public class AnonymousOutputCacheAttribute : OutputCacheAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(filterContext.HttpContext.User.Identity.IsAuthenticated) 
      return; 

     base.OnActionExecuting(filterContext); 
    } 
} 

इस परीक्षण नहीं किया है, लेकिन मैं कारण नहीं दिख रहा है क्यों यह shouldn ' टी काम नहीं

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