2009-06-25 18 views
20

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

हम परिणामों के प्रत्येक पृष्ठ को कैश नहीं कर सकते हैं, क्योंकि हम स्मृति से बाधित हैं, लेकिन कैशिंग का लाभ प्रत्येक श्रेणी के लिए परिणामों का पहला पृष्ठ बहुत बड़ा होगा।

मैं जानता हूँ कि मैं कुछ इसी तरह वस्तु कैशिंग का उपयोग कर प्रश्न में डेटासेट स्टोर करने के लिए कर सकता है, लेकिन response.Cache वस्तु का उपयोग करके उत्पादन कैशिंग का उपयोग कर, शायद यह संभव है?

पृष्ठ में जीवन चक्र यह कहां किया जा सकता है? पूर्व प्रस्तुत करना?

बहुत सरल बनाया, यूआरएल की तरह "/ productlist श्रेणी = कुछ & पृष्ठ = 1?" और मैं की तरह तर्क कुछ (स्यूडोकोड) चाहते हैं कुछ है:

If paramater "Page" equals 1 
    Use output caching: vary by param = "categoryName; page" 
else 
    Don't use caching at all, just render the page from scratch. 

हम ASP.NET का उपयोग कर रहे 2.0, आईआईएस 6/win2003 पर।

+0

[इस] पर अंतिम उत्तर देखें [http://stackoverflow.com/questions/1122837/how-do-i-configure-asp-net-outputcache-to-vary-by-http-vs -https) पोस्ट। आशा है कि ये आपकी मदद करेगा। – James

उत्तर

30

इसके बजाय, आप एक ही बात प्रोग्राम इस प्रकार कर सकते हैं:

if (yourArbitraryCondition) { 
    OutputCacheParameters outputCacheSettings = new OutputCacheParameters(); 
    outputCacheSettings.Duration = 60; 
    InitOutputCache(outputCacheSettings); 
} 

OnInit से ऐसा करने से ठीक काम करना चाहिए। और जाहिर है, आप आउटपुट कैश पैरामीटर पर विभिन्न गुणों को सेट करके कैशिंग व्यवहार को ट्विक कर सकते हैं, जिसमें निर्देश के रूप में सभी वही knobs हैं (वास्तव में, जब हम निर्देश का उपयोग करते हैं तो हम यही उत्पन्न करते हैं)।

मुख्य बिंदु यह है कि आप केवल इस तर्क को सशर्त रूप से निष्पादित कर रहे हैं, जबकि निर्देश इसे बिना शर्त बना देता है।

अद्यतन:

एक विकल्प के रूप में, आप निम्न स्तर कैश एपीआई कि उपरोक्त कोड पर बनाया गया है का उपयोग कर सकते हैं। जैसे

HttpCachePolicy cache = Response.Cache; 
cache.SetCacheability(HttpCacheability.Public); 
cache.SetExpires(Context.Timestamp.AddSeconds(60)); 
cache.VaryByParams["categoryName"] = true; 

असल में, यह एक ही बात करने का एक और तरीका है, किसी भी एपीआई के रूप में 'नहीं बुलाया जाना चाहिए' रूप में चिह्नित है का उपयोग किए बिना। अंत में, कोई भी तरीका काम करेगा, इसलिए अपना चयन करें।

+0

काम करता है। कोई विचार क्यों 'InitOutputCache'' EditorBrowsableState.Never' है और इसे सीधे http://msdn.microsoft.com/en-us/library/ms153473.aspx के अनुसार नहीं कहा जाना चाहिए? –

+1

ठीक है, जब हम इसे पहले डिजाइन करते हैं तो यह ज्यादातर आगे सोचने की कमी के कारण होता है। पेज पर कई सार्वजनिक/संरक्षित एपीआई हैं जिन्हें इस तरह चिह्नित किया गया है। वे सभी चीजें हैं जिन्हें विभिन्न वाक्यविन्यास का उपयोग करने के परिणामस्वरूप जेनरेट कोड द्वारा बुलाया जाता है, और हमने पाया कि उपयोगकर्ता के पास उन्हें सीधे कॉल करने के कोई अच्छे कारण नहीं हैं। लेकिन वास्तविकता यह है कि उन्हें स्वयं को बुलाए जाने में कुछ भी गलत नहीं है, और वास्तव में यहां ऐसे समय हैं जहां यह आपको ऐसी चीजें करने देता है जो आप पेज सिंटैक्स के साथ नहीं कर सकते। मैं उन झंडे को हटाने के लिए एक बग फाइल करूंगा, हालांकि यह वीएस -2010 के लिए देर हो चुकी है। –

+0

एक और बात: आप वास्तव में निम्न स्तर कैश एपीआई को सीधे कॉल करके (और InitOutputCache से बचकर) वही काम कर सकते हैं। यह वही काम करेगा, लेकिन कोड अधिक जटिल होगा। अगर आप उस वैकल्पिक समाधान चाहते हैं तो मुझे बताएं। –

0

मुझे लगता है कि आप OutputCache directive का उपयोग VaryByParam प्रॉपर्टी सेट के साथ आउटपुट कैश को बदलने के लिए प्रयुक्त स्ट्रिंग्स की सेमी-कॉलन से अलग सूची में सेट करने में सक्षम होना चाहिए।

जब तक आप केवल कैश करना चाहते थे जब पृष्ठ == 1?

+0

दुर्भाग्य से यह वही है जो मैं चाहता हूं (केवल तभी जब पृष्ठ == 1)। यदि मैं परिणामों के हर पृष्ठ को कैश करना चाहता हूं जो कि आसान होगा, तो भिन्नता का प्रयोग करके आप कहें। क्षमा करें मुझे नहीं लगता कि मैंने प्रश्न को स्पष्ट रूप से phrased किया है, लेकिन मैं जो भी कर रहा हूं वह केवल सामान्य परिदृश्य के लिए अलग-अलग (लेकिन महत्वपूर्ण) अलग है। –

5

संपादित करें:मुझे डेविड एबो के जवाब को अपने आप से बहुत बेहतर पसंद है।


आप

<%@ OutputCache Duration="60" VaryByParam="none" VaryByCustom="pageOne" %> 

का उपयोग करें और एक तरीका है कि पहले पृष्ठ और अन्य सभी पृष्ठों के लिए एक यादृच्छिक कुंजी के लिए एक निश्चित कुंजी रिटर्न में इसे लागू कर सकते हैं। आप (और ) scavenging तंत्र को स्मृति की देखभाल करने दें, लेकिन यदि आपको आवश्यक हो तो कैश आइटम को निकालने के लिए आप HttpResponse.RemoveOutputCacheItem का उपयोग कर सकते हैं। OutputCache निर्देश का उपयोग करने का

public override string GetVaryByCustomString(HttpContext ctx, string custom) 
{ 
    if(custom == "pageOne") 
    { 
     if(ctx.Request["page"] == "1") 
     { 
      return "1"; 
     } 

     HttpResponse.RemoveOutputCacheItem("/Default.aspx"); 
     return Guid.NewGuid().ToString(); 
    } 
    return base.GetVaryByCustomString(ctx, custom); 
} 
4

मेरा मानना ​​है कि ऐसा करने के लिए सबसे अच्छा तरीका है का उपयोग करने के HttpCachePolicy.AddValidationCallback

http://www.hanselman.com/blog/AdvancedASPNETCachingAndAddValidationCallBack.aspx देखें है - वहाँ एक पूर्ण उदाहरण है कि ठीक इस सवाल का जवाब है।

1

आप अभी भी आउटपुट कैश निर्देश का उपयोग कर सकते हैं, और मेरी राय में, कैशिंग नट्स और बोल्ट के समूह के साथ अपने पेज कोड को कूड़ेदान के बजाय, आप ग्लोबल.एक्सएक्स में इसे संभालने के आधार पर पुन: प्रयोज्य समाधान के साथ जाने से बेहतर हैं। जिस तरह से आप आमतौर पर किसी भी VaryBy कस्टम परिदृश्य होगा।

तो, उदाहरण के लिए, यदि आप दोहराने वाले के साथ पेजिंग दृष्टिकोण का उपयोग कर रहे हैं, तो आप बस अपने खोज परिदृश्य में कैश से किसी विशेष पृष्ठ पर किसी भी पोस्टबैक को बाहर करना चाहते हैं। Here एक कोड उदाहरण है जो बस यही करता है। दृष्टिकोण को केवल कैप्चरिंग से बचने के लिए इच्छित मानदंडों को फँसाने के बाद, Response.Cache.SetNoServerCaching() तक पहुंचने के लिए HttpContext ऑब्जेक्ट का उपयोग करने की आवश्यकता है। आशा है कि ये आपकी मदद करेगा।

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