список записей OutputCache

в моем приложении asp.net mvc я использую атрибут OutputCache для другого метода действия. Можно ли просмотреть текущие записи в кеше, связанные с атрибутом OutputCache? Если я перейду на System.Web.HttpContext.Current.Cache, я не найду этот тип записи. Заранее спасибо Ф.


person tartafe    schedule 01.07.2010    source источник


Ответы (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);
      }
   }
}
person Branislav Abadjimarinov    schedule 10.12.2010
comment
В понедельник попробую, о результатах скажу. Спасибо. - person Mauro; 11.12.2010
comment
Привет, Бранислав, есть ли способ отфильтровать кеш, чтобы получать только мои записи? Спасибо - person Mauro; 14.12.2010
comment
Да, вы можете найти записи выходного кэша, собранные в списке outputCacheEntries. К сожалению, там не так много, чтобы увидеть. Тем не менее, я надеюсь, что это поможет вашему делу. - person Branislav Abadjimarinov; 16.12.2010
comment
@BranislavAbadjimarinov Отлично! И как мы можем получить сохраненное значение VarByCustom в кэшированных элементах? Я хочу отфильтровать outputCacheEntries по значению VarByCustom. - person Ali Adlavaran; 01.03.2016
comment
Я имею в виду, что хочу получить возвращаемое значение функции GetVaryByCustomString, созданное для каждого кэшированного элемента. - person Ali Adlavaran; 01.03.2016