в моем приложении asp.net mvc я использую атрибут OutputCache для другого метода действия. Можно ли просмотреть текущие записи в кеше, связанные с атрибутом OutputCache? Если я перейду на System.Web.HttpContext.Current.Cache
, я не найду этот тип записи. Заранее спасибо Ф.
список записей OutputCache
Ответы (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);
}
}
}
VarByCustom
в кэшированных элементах? Я хочу отфильтровать outputCacheEntries
по значению VarByCustom
.
- person Ali Adlavaran; 01.03.2016
GetVaryByCustomString
, созданное для каждого кэшированного элемента.
- person Ali Adlavaran; 01.03.2016