2011-01-29 18 views
5

में सशर्त आउटपुट कैशिंग आउटपुट कैश से अनुरोध को हल करने के लिए प्रोग्रामेटिक रूप से ASP.NET को प्रोग्राम करने के तरीके के बारे में एक प्रश्न है।एएसपी.नेट

कल्पना कीजिए कि आपके पास एक पृष्ठ आउटपुट कैश किया गया है (उदा। http://domain/page.aspx) सीएमएस से कैश नीति सेटिंग्स को रनटाइम पर HttpResponse पर लागू करने के माध्यम से। प्रति अनुरोध आधार पर यानी वर्तमान उपयोगकर्ता को प्रमाणित किया जाता है + ज्ञात समूहों (या व्यापार तर्क द्वारा मिलान) के एक समूह का सदस्य, मैं एएसपी.NET को को को आउटपुट से अनुरोध को हल करने के लिए निर्देश देना चाहता हूं कैश।

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

ठेठ सुझाव VaryByHeader, VaryByParam आदि का उपयोग करें और उत्पादन कैश दूषित करते है - अच्छा नहीं है, लेकिन उत्पादन कैश मॉड्यूल में खुदाई करते समय परावर्तक का उपयोग कर, मैंने देखा है कि उत्पादन कैश मॉड्यूल मामले एक जोड़े में वर्तमान अनुरोध को छोड़ देता है ज्ञात "कैश-कंट्रोल" हेडर मौजूद हैं। जहां तक ​​मैं हेडर के बारे में चिंतित हूं, इन्हें ब्राउज़र से भेजा जाता है यदि उपयोगकर्ता पता बार में F5 या ENTER मारकर एक नई प्रतिलिपि प्रस्तुत करने के लिए मजबूर करता है।

तो, मैं जो कर रहा हूं वह एक कस्टम http मॉड्यूल में "कैश-कंट्रोल" हेडर को "नो-कैश" पर सेट कर रहा है जो किसी ऐसे ईवेंट में होता है जो ResolveRequestCache ईवेंट से पहले होता है जिसमें आउटपुट कैश सदस्यता लेता है। इस तरह:

context.Request.Headers["Cache-Control"] = "no-cache"; 

सभी, अच्छा और dandy है लेकिन, अगर HttpCachePolicy.SetValidUntilExpires (सही) कैश नीति सेट होती है, ASP.NET अनुरोध हेडर पहले से निर्धारित की उपेक्षा करता है और उत्पादन कैश से अनुरोध कार्य करता है।

एक विकल्प के रूप में, मुझे लगता है कि मैं एक ही http मॉड्यूल में एक पोस्ट-प्रोसेसिंग ईवेंट में अतिरिक्त कोड लिख सकता हूं ताकि यह सुनिश्चित किया जा सके कि HttpCachePolicy.SetValidUntilExpires (false) को आउटपुट कैशिंग कॉन्फ़िगर किया गया है, लेकिन मुझे लगता है कि यह वास्तव में आउटपुट कैश से अनुरोध को हल करने के लिए एएसपी.NET को निर्देश देने में सक्षम होने के लिए एक और अधिक साफ समाधान होगा। मैं इस सवाल के बहुत सारे समाधानों की कल्पना कर सकता हूं, लेकिन मैं सही के बाद हूं।

संदर्भ के लिए, मैं अगर सबसे कोशिश कर रहे हैं नहीं HttpCachePolicy वर्ग उदा .:

HttpResponse.Cache.SetNoServerCaching()). 

उत्तर

3

आप अपने आवेदन में HttpCacheValidateHandler जोड़ सकते हैं जिसमें आप अपने इच्छित तर्क को लागू कर सकते हैं। इसे ResolveRequestCache ईवेंट के दौरान निष्पादित किया जाएगा जिसे प्रमाणीकरण और प्रमाणीकरण निष्पादित करने के बाद निकाल दिया गया है। उस मामले में HttpValidationStatus.IgnoreThisRequest वापस करने के लिए कुंजी है जहां आप कैश को बाईपास करना चाहते हैं।

संदर्भ के लिए इस नमूने HttpModule देखें:

public class CacheModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += 
      (s, e) => context.Context.Response.Cache 
         .AddValidationCallback(CacheHandler, null); 
    } 

    private static void CacheHandler(
     HttpContext context, object data, 
     ref HttpValidationStatus validationstatus) 
    { 
     // bypass cache for all users with skipCache cookie 
     validationstatus = 
      context.Request.Cookies["skipCache"] != null 
       ? HttpValidationStatus.IgnoreThisRequest 
       : HttpValidationStatus.Valid; 
    } 

    public void Dispose() 
    { 
    } 
} 
+0

ओलिवर, यह बहुत देर हो चुकी है और धन्यवाद उत्तर के लिए जो मैंने अभी लागू किया है। मैं सोच रहा हूं कि मैं ** AddValidationCallback ** विधि को कैसे याद कर सकता था .. फिर फिर, क्या मायने रखता है ढांचे के साथ काम करना, जो कि मैंने पिछले कार्यान्वयन के साथ याद किया था। –

0

मुझे यकीन है कि कुछ के बाद ऐसा करने का एक समर्थित विधि कैश किया गया है है कि क्या वहाँ नहीं कर रहा हूँ के सभी प्रासंगिक तरीकों।

लेकिन आपको VaryByHeader विकल्प क्यों पसंद नहीं है? मान लीजिए कि एक हेडर है जिसे आप लॉग इन करने और उपयोगकर्ताओं में लॉग इन करने के बीच अंतर करने के लिए देख सकते हैं, जो काम करना चाहिए। यदि आपके पास लॉग इन नहीं किया गया है तो यह कैश को प्रदूषित नहीं करेगा यदि उपयोगकर्ता लॉग इन नहीं करता है तो उपयोगकर्ता लॉग इन नहीं करता है। उपयोगकर्ताओं में लॉग इन किया जाता है, फिर भी कैश मिस प्राप्त होता है।

+0

VaryByHeader निश्चित रूप से काम कर सकता था, लेकिन मैं एक तंत्र की जरूरत है सुनिश्चित करें कि शीर्ष लेख सेट कर दिया जाता हैं। आप क्या सुझाव दे रहे हैं एक HttpModule लागू करें जो कस्टम हेडर सेट करता है (यानी हेडर ["कस्टम-हेडर"] = "नो-कैश" और फिर उसमें भिन्नता है? –

+0

शायद मैंने इसे पूरी तरह से नहीं सोचा था। मैं उम्मीद कर रहा था कि अलग-अलग शीर्षलेख होंगे ब्राउज़र से आ रहा है (एक ऑथ कुकी की तरह) जो दो मामलों को अलग करने की इजाजत देता है। –

+0

यह एक अच्छा सुझाव है, लेकिन मेरे पास फॉर्म प्रमाणीकरण या समान कुकी आधारित प्रमाणीकरण का वास्तव में हस्ताक्षर है। हालांकि, विभिन्न प्रकार के प्रमाणीकरण हैं स्तर, जिनमें से सभी को एक ही प्रमाणीकरण तंत्र (यानी कुकी) से हल किया जाता है, मैं प्राधिकरण स्तर के आधार पर अलग-अलग कुकीज़ सेट करने का सहारा ले सकता हूं। मुझे लगता है कि यह घुलनशील लगता है और ढांचे के खिलाफ काम करना पसंद करता है। –