在我的 asp.net mvc 应用程序中,我在不同的操作方法上使用了 OutputCache 属性。是否可以查看与 OutputCache 属性相关的缓存中的当前条目?如果我 cicle onSystem.Web.HttpContext.Current.Cache
我找不到这种类型的条目。在此先感谢 F。
1 回答
输出缓存不可公开访问,因此您不会在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);
}
}
}