tar*_*afe 10 asp.net asp.net-mvc caching outputcache asp.net-mvc-2
在我的asp.net mvc应用程序中,我在不同的操作方法上使用OutputCache属性.是否可以查看与OutputCache属性相关的缓存中的当前条目?如果我在cicle上System.Web.HttpContext.Current.Cache我没有找到这种类型的条目.在此先感谢F.
Bra*_*nov 11
输出缓存不可公开访问,因此您无法找到它System.Web.HttpContext.Current.Cache.在ASP.NET二是包含在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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3407 次 |
| 最近记录: |