список записей OutputCache - PullRequest
10 голосов
/ 01 июля 2010

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

1 Ответ

11 голосов
/ 10 декабря 2010

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