2010-07-01 36 views
8

在我的asp.net mvc應用程序中,我在不同的操作方法上使用了OutputCache屬性。 是否可以查看與OutputCache屬性相關的緩存上的當前條目? 如果我cicle在System.Web.HttpContext.Current.Cache我沒有找到這種類型的條目。 在此先感謝F.列表OutputCache條目

+0

noone can help me ??? – tartafe 2010-07-07 10:02:32

回答

10

輸出緩存不公開,因此您不會在System.Web.HttpContext.Current.Cache中找到它。在ASP.NET 2中,它包含在CacheInternal_caches成員中,您可以通過名稱猜測它是內部抽象類的私有成員。 雖然這不是一件容易的事,但可以用反射來檢索它。

此外,如果您檢索它,您會看到它包含各種內部緩存條目,如配置文件路徑緩存,動態生成的類緩存,移動功能,原始響應緩存(這是輸出緩存項的類型)。

假設您可以過濾與輸出緩存相關的項目。問題是,除了密鑰和原始響應(如字節數組)之外,它們不包含許多人類可讀的信息。如果使用GET(a1)或POST(a2)方法,密鑰通常由信息組成,站點名稱,相關參數的根相對URL和哈希。

我想這是一個常見的痛點,所以在ASP.NET 4中引入了自定義輸出緩存提供程序的新概念。您可以實現自己的從OutputCacheProvider繼承的輸出緩存提供程序,並提供一個返回所有條目的方法。你可以看看這篇文章 - http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx。我個人沒有看過新的OutputCache基礎設施,所以如果你發現任何有趣的東西,寫一下它會很有趣。

這是檢索內部緩存條目的代碼。您可以在Visual Studio中調試時瀏覽它們的值:

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 2010-12-11 13:52:31

+0

嗨Branislav,有沒有一種方法來過濾緩存,以獲得只有我的條目?謝謝 – Mauro 2010-12-14 08:52:17

+0

是的,您可以在outputCacheEntries列表中找到收集的輸出緩存條目。可悲的是,沒有什麼可看的。不過,我希望它能幫助你的情況。 – 2010-12-16 14:23:55