首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列出OutputCache条目

列出OutputCache条目
EN

Stack Overflow用户
提问于 2010-07-01 18:07:05
回答 1查看 3.9K关注 0票数 10

在我的asp.net mvc应用程序中,我在不同的操作方法上使用了OutputCache属性。是否可以查看缓存中与OutputCache属性相关的当前条目?如果我在System.Web.HttpContext.Current.Cache上搜索,我找不到这种类型的条目。提前感谢F。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-11 00:21:59

输出缓存是不可公开访问的,因此您在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中调试时浏览它们的值:

代码语言:javascript
复制
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);
      }
   }
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3156792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档