列出 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 条目的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以清除/刷新/删除OutputCache?

列出远程机器上 jndi 中所有条目的代码

ASP.NET-缓存outputcache参数

C# - 缓存OutputCache基础配置

如何在 Mono MVC2 应用程序中清除 OutputCache

IIS(动态和静态)缓存、OutPutCache 和浏览器缓存有啥区别