2010-07-01 7 views
8

मेरे asp.net mvc एप्लिकेशन में मैं विभिन्न क्रिया विधि पर आउटपुट कैश विशेषता का उपयोग कर रहा हूं। आउटपुट कैश विशेषता से संबंधित कैश पर वर्तमान प्रविष्टियों को देखना संभव है? यदि मैं System.Web.HttpContext.Current.Cache पर कण करता हूं तो मुझे इस प्रकार की प्रविष्टि नहीं मिलती है। अग्रिम धन्यवाद एफसूची आउटपुट कैश प्रविष्टि

+0

कोई भी मेरी मदद कर सकता है ??? – tartafe

उत्तर

10

आउटपुट कैश सार्वजनिक रूप से सुलभ नहीं है, इसलिए आपको इसे System.Web.HttpContext.Current.Cache में नहीं मिलेगा। एएसपी.नेट 2 में यह CacheInternal के _caches सदस्य में निहित है, जिसे आप नाम से अनुमान लगा सकते हैं आंतरिक सार वर्ग का एक निजी सदस्य है। प्रतिबिंब के साथ इसे पुनर्प्राप्त करना संभव है, हालांकि यह एक आसान काम नहीं है।

यदि आप इसे पुनर्प्राप्त करते हैं तो भी आप देखेंगे कि इसमें सभी प्रकार की आंतरिक कैश प्रविष्टियां हैं जैसे कॉन्फ़िगरेशन फ़ाइलें पथ कैश, गतिशील रूप से जेनरेट की गई कक्षा कैश, मोबाइल क्षमताओं, कच्चे प्रतिक्रिया कैश (यह आउटपुट कैश आइटम का प्रकार है)।

मान लें कि आप आउटपुट कैश से संबंधित आइटम फ़िल्टर कर सकते हैं। समस्या यह है कि उनमें कुंजी और कच्ची प्रतिक्रिया (बाइट सरणी के रूप में) के अलावा बहुत अधिक मानव पठनीय जानकारी नहीं होती है। कुंजी में आमतौर पर जानकारी होती है यदि GET (a1) या POST (a2) विधि का उपयोग किया जाता है, साइट का नाम, रूट रिश्तेदार यूआरएल और आश्रित मानकों के हैश।

मुझे लगता है कि यह एक सामान्य दर्द बिंदु था इसलिए एएसपी.NET 4 में कस्टम आउटपुट कैश प्रदाताओं की एक नई अवधारणा पेश की गई थी। आप आउटपुट कैशप्रोवाइडर से प्राप्त अपने आउटपुट कैश प्रदाता को कार्यान्वित कर सकते हैं और एक ऐसी विधि प्रदान कर सकते हैं जो सभी प्रविष्टियों को वापस कर दे। आप इस आलेख को देख सकते हैं - http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx। मैंने व्यक्तिगत रूप से नए आउटपुट कैश इंफ्रास्ट्रक्चर में नहीं देखा है, इसलिए यदि आपको कुछ मिलता है तो इसके बारे में लिखना दिलचस्प होगा।

यह आंतरिक कैश प्रविष्टियों को पुनर्प्राप्त करने के लिए कोड है। विजुअल स्टूडियो में डिबगिंग करते समय आप उनके मूल्य ब्राउज़ कर सकते हैं:

Type runtimeType = typeof(HttpRuntime); 

PropertyInfo ci = runtimeType.GetProperty(
    "CacheInternal", 
    BindingFlags.NonPublic | BindingFlags.Static); 

Object cache = ci.GetValue(ci, new object[0]); 

FieldInfo cachesInfo = cache.GetType().GetField(
    "_caches", 
    BindingFlags.NonPublic | BindingFlags.Instance); 
object cacheEntries = cachesInfo.GetValue(cache); 

List<object> outputCacheEntries = new List<object>(); 

foreach (Object singleCache in cacheEntries as Array) 
{ 
    FieldInfo singleCacheInfo = 
    singleCache.GetType().GetField("_entries", 
     BindingFlags.NonPublic | BindingFlags.Instance); 
    object entries = singleCacheInfo.GetValue(singleCache); 

    foreach (DictionaryEntry cacheEntry in entries as Hashtable) 
    { 
     FieldInfo cacheEntryInfo = cacheEntry.Value.GetType().GetField("_value", 
     BindingFlags.NonPublic | BindingFlags.Instance); 
     object value = cacheEntryInfo.GetValue(cacheEntry.Value); 
     if (value.GetType().Name == "CachedRawResponse") 
     { 
     outputCacheEntries.Add(value); 
     } 
    } 
} 
+0

मैं इसे सोमवार को आज़मा दूंगा और आपको परिणाम बताऊंगा। धन्यवाद। – Mauro

+0

हाय ब्रानिस्लाव, क्या केवल मेरी प्रविष्टियां प्राप्त करने के लिए कैश को फ़िल्टर करने का कोई तरीका है? धन्यवाद – Mauro

+0

हां, आप outputCacheEntries सूची में एकत्रित आउटपुट कैश प्रविष्टियां पा सकते हैं। दुख की बात है कि देखने के लिए बहुत कुछ नहीं है। फिर भी मुझे उम्मीद है कि यह आपके मामले में मदद करेगा। –