Выходной кэш не является общедоступным, поэтому вы не найдете его в 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);
}
}
}