列出 OutputCache 条目
Posted
技术标签:
【中文标题】列出 OutputCache 条目【英文标题】:list OutputCache entry 【发布时间】:2011-03-10 13:34:07 【问题描述】:在我的 asp.net mvc 应用程序中,我在不同的操作方法上使用了 OutputCache 属性。
是否可以查看与 OutputCache 属性相关的缓存中的当前条目?
如果我在System.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);
【讨论】:
我会在星期一试一试,然后告诉你结果。谢谢。 嗨 Branislav,有没有办法过滤缓存以便只获取我的条目?谢谢 是的,您可以在 outputCacheEntries 列表中找到收集的输出缓存条目。遗憾的是没有太多可看的。不过,我希望它对您的情况有所帮助。 @BranislavAbadjimarinov 完美!以及我们如何在缓存项中获取VarByCustom
的存储值?我想通过VarByCustom
值过滤outputCacheEntries
。
我的意思是我想得到 GetVaryByCustomString
函数的返回值,为每个缓存项生成。以上是关于列出 OutputCache 条目的主要内容,如果未能解决你的问题,请参考以下文章