2008-08-14 5 views
49

में समाशोधन पृष्ठ कैश अपने ब्लॉग के लिए मैं लगभग 10 मिनट के लिए एक perticular पद का संचित संस्करण को बचाने के लिए आउटपुट कैश का उपयोग करना चाहते रहा हूँ, और ठीक thats ...ASP.NET

<%@OutputCache Duration="600" VaryByParam="*" %> 

हालांकि, अगर कोई टिप्पणी पोस्ट करता है, तो मैं कैश साफ़ करना चाहता हूं ताकि पृष्ठ रीफ्रेश हो और टिप्पणी देखी जा सके।

मैं इसे ASP.Net C# में कैसे कर सकता हूं?

उत्तर

45

मैं इस सवाल का जवाब मैं खोज रहा था मिल गया है:

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx"); 
+0

क्या किसी को पता है कि क्लासिक एएसपी के लिए ऐसा कुछ उपलब्ध है या नहीं? – Brettski

+0

मुझे नहीं लगता कि एएसपी में कैशिंग उपलब्ध थी, इसलिए कोई खेद नहीं है। – GateKiller

+0

यह उस पृष्ठ के लिए प्रत्येक पैरा के लिए सभी के लिए सभी कैश साफ़ करता है। – Salim

1

हम्म। आप आउटपुट कैश आइटम पर VaryByCustom विशेषता निर्दिष्ट कर सकते हैं। इसका मान GetVaryByCustomString विधि के पैरामीटर के रूप में पारित किया गया है जिसे आप global.asax में कार्यान्वित कर सकते हैं। इस विधि द्वारा लौटाए गए मान को कैश किए गए आइटमों में एक इंडेक्स के रूप में उपयोग किया जाता है - यदि आप पृष्ठ पर टिप्पणियों की संख्या वापस करते हैं, उदाहरण के लिए, प्रत्येक बार जब कोई टिप्पणी जोड़ा जाता है तो एक नया पृष्ठ कैश किया जाएगा।

इस के लिए चेतावनी यह है कि यह वास्तव में कैश को साफ़ नहीं करता है। यदि किसी ब्लॉग एंट्री को भारी टिप्पणी का उपयोग मिलता है, तो आपका कैश इस विधि के साथ आकार में विस्फोट कर सकता है।

वैकल्पिक रूप से, आप पृष्ठ के गैर-परिवर्तनीय बिट्स (नेविगेशन, विज्ञापन, वास्तविक ब्लॉग प्रविष्टि) को उपयोगकर्ता नियंत्रण के रूप में लागू कर सकते हैं और उन उपयोगकर्ता नियंत्रणों में आंशिक पृष्ठ कैशिंग लागू कर सकते हैं।

1

आप "*" सिर्फ मापदंडों कैश पर अलग-अलग हो जाना चाहिए कि आप कुछ इस तरह कर सकते हैं करने के लिए बदलते हैं (postid?):

//add dependency 
string key = "post.aspx?id=" + PostID.ToString(); 
Cache[key] = new object(); 
Response.AddCacheItemDependency(key); 

और जब कोई एक टिप्पणी कहते हैं ...

Cache.Remove(key); 

मुझे लगता है कि यह VaryByParam * के साथ भी काम करेगा, क्योंकि सभी अनुरोध एक ही कैश निर्भरता से बंधे होंगे।

5

सभी outputcaches स्पष्ट करने के Response.AddCacheItemDependency का उपयोग करना।

public class Page : System.Web.UI.Page 
    { 
    protected override void OnLoad(EventArgs e) 
    { 
     try 
     { 
      string cacheKey = "cacheKey"; 
      object cache = HttpContext.Current.Cache[cacheKey]; 
      if (cache == null) 
      { 
       HttpContext.Current.Cache[cacheKey] = DateTime.UtcNow.ToString(); 
      } 

      Response.AddCacheItemDependency(cacheKey); 
     } 
     catch (Exception ex) 
     { 
      throw new SystemException(ex.Message); 
     } 

     base.OnLoad(e); 
    }  
} 



    // Clear All OutPutCache Method  

    public void ClearAllOutPutCache() 
    { 
     string cacheKey = "cacheKey"; 
     HttpContext.Cache.Remove(cacheKey); 
    } 

इसका उपयोग एएसपी.नेट एमवीसी के आउटपुट कैशपेज में भी किया जा सकता है।

+0

बिल्कुल सही, यही वह है जिसे मैं ढूंढ रहा हूं। आपको केवल एक चीज बदलनी चाहिए। HttpContext.Current.Cache.Remove (cacheKey); – Salim

1

पोस्ट टेबल पर sqlcached निर्भरता का उपयोग क्यों नहीं करें?

sqlcachedependency msdn

इस तरह अपने कस्टम कैश समाशोधन कोड को लागू करने नहीं और बस DB में सामग्री में परिवर्तन के रूप में कैश ताज़ा?

38

उपरोक्त ठीक है अगर आप जानते हैं कि आप किन पृष्ठों को कैश साफ़ करना चाहते हैं। मेरे उदाहरण में (एएसपी.नेट एमवीसी) मैंने पूरे डेटा से संदर्भित किया। इसलिए, जब मैंने एक [बचाया] किया तो मैं कैश साइट को चौड़ा करना चाहता था। यह मेरे लिए काम करता है: http://aspalliance.com/668

यह ऑनएक्शन एक्सेलिंग फ़िल्टर के संदर्भ में किया जाता है। यह बेसकंट्रोलर या कुछ में OnActionExecuting को ओवरराइड करके आसानी से किया जा सकता है।

HttpContextBase httpContext = filterContext.HttpContext; 
httpContext.Response.AddCacheItemDependency("Pages"); 

सेटअप:

protected void Application_Start() 
{ 
    HttpRuntime.Cache.Insert("Pages", DateTime.Now); 
} 

माइनर Tweak: मैं एक सहायक जो "फ्लैश संदेशों" (त्रुटि संदेश, सफलता संदेश - "यह आइटम सफलतापूर्वक सहेजा गया है", आदि) कहते है। फ्लैश संदेश से बचने के लिए प्रत्येक आगामी जीईटी पर दिखने से बचने के लिए, मुझे फ़्लैश संदेश लिखने के बाद अमान्य करना पड़ा।

क्लियरिंग कैश:

HttpRuntime.Cache.Insert("Pages", DateTime.Now); 

आशा इस मदद करता है।

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 

और प्रस्थान करें बटन क्लिक में:

+3

आईआर केवल पूरे पृष्ठ कैशिंग के लिए काम करता है। यह बाल कार्यों के लिए काम नहीं करता है। कोई सुझाव? –

+3

और.maz क्या आपने इसे समझ लिया? –

+0

@ and.maz यदि आपको पता चला कि बच्चे के कार्यों के लिए इसे कैसे किया जाए, तो यहां एक इनाम है [http://stackoverflow.com/q/5126751/63733)। – marapet

0

HttpRuntime.Close() .. मैं सब विधि का प्रयास करते हैं और इस के लिए ही मुझे

+6

के बाद वेबसाइट के सभी कैश किए गए पृष्ठों को साफ़ करने के तरीके को समझा सकते हैं, मुझे संदेह होगा कि यह एएसपी बंद कर रहा है। आईआईएस पर नेट आवेदन प्रक्रिया। यह थोड़ा अधिक लगता है, शायद सभी कैश साफ़ करेगा और बड़ी वेबसाइटों पर महत्वपूर्ण प्रदर्शन समस्याएं होगी। – GateKiller

3

मास्टर पेज लोड घटना पर है कि काम है, कृपया निम्न लिखें:

Session.Abandon(); 
Session.Clear();