2010-07-01 50 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