Какой-либо способ очистить/сбросить/удалить OutputCache?

Я не уверен, имеет ли это смысл в контексте, который вы видите, но единственное использование «разрывов» в вычислениях, с которыми я знаком, - это когда данные из разных кадров отображаются на экране одновременно. [111 ]

В Википедии есть статья , если вы хотите больше данных.

Если это не «разрыв», с которым вы сталкиваетесь, возможно, вы могли бы предоставить немного больше контекста? Если код с открытым исходным кодом, ссылки на него будут великолепны.

28
задан Alex 26 October 2011 в 14:41
поделиться

5 ответов

Можно использовать VaryByCustom параметр для этого.

В Вашем пользовательском элементе управления у Вас было бы следующее:

<%@ OutputCache Duration="1000" VaryByParam="None" VaryByCustom="MyKey" %>

Затем Вы переопределили бы GetVaryByCustomString метод в Вашем Global.asax как так:

public override string GetVaryByCustomString(HttpContext context, string arg)
{
    if (arg == "MyKey")
    {
        object o = context.Current.Application["MyGuid"];
        if (o == null)
        {
            o = Guid.NewGuid();
            context.Current.Application["MyGuid"] = o;
        }
        return o.ToString();
    }
    return base.GetVaryByCustomString(context, arg);
}

Наконец в MyPage.aspx Вы сделали бы это:

Application["MyGuid"] = Guid.NewGuid();

, Как это работает?

Каждый раз, когда Ваше управление кэшируется, оно связано со строкой (строка, возвращенная из GetVaryByCustomString метод, когда Ваше управление VaryByCustom ключ передается в него).

Каждый раз, когда управление впоследствии используется, GetVaryByCustomString, назван снова. Если возвращаемая строка соответствует кэшированной версии управления, то кэшированная версия используется.

В нашем случае, "MyKey" передается в GetVaryByCustomString, и он возвращает то, что хранится в [1 110].

Каждый раз, когда MyPage.aspx назван, это изменяется Application["MyGuid"] на новое случайное значение.

, Когда Ваше управление затем используется GetVaryByCustomString, метод возвратит новое значение, и потому что нет никакой кэшированной версии управления, связанного с тем значением, управление будет повторно создано. (Управление будет затем кэшироваться и связываться с новым значением, для сохранения до следующего вызова к [1 114] и т.д.)

существует обзор здесь .

33
ответ дан LukeH 28 November 2019 в 02:54
поделиться

Редактирование: при включении ядра, кэширующегося на II6 + затем, необходимо будет пойти с советом Luke и использовать заголовок VaryByCustom, поскольку очищающийся кэш ASP.NET не будет влиять на кэш ядра.

OutputCache хранится в Кэше ASP.NET, таким образом, можно просто назвать Кэш. Удалите:

List<string> keys = new List<string>();

foreach(string key in HttpRuntime.Cache)
{
    keys.Add(key);
}

foreach(string key in keys)
{
    Cache.Remove(key);
}

Это, однако, удалит ВСЕ записи кэша, включая пользовательские записи, добавленные Вашим кодом.

4
ответ дан Richard Szalay 28 November 2019 в 02:54
поделиться

Вдохновившись другим постом, следующий фрагмент успешно удаляет каждую страницу, кэшированную OutputCache в asp.net с помощью отражения:

        public static void ClearOutputCache()
        {

            var runtimeType = typeof(HttpRuntime);

            var ci = runtimeType.GetProperty(
               "CacheInternal",
               BindingFlags.NonPublic | BindingFlags.Static);

            var cache = ci.GetValue(ci, new object[0]);

            var cachesInfo = cache.GetType().GetField(
                "_caches",
                BindingFlags.NonPublic | BindingFlags.Instance);
            var cacheEntries = cachesInfo.GetValue(cache);

            var outputCacheEntries = new List<object>();

            foreach (Object singleCache in cacheEntries as Array)
            {
                var singleCacheInfo =
                singleCache.GetType().GetField("_entries",
                   BindingFlags.NonPublic | BindingFlags.Instance);
                var entries = singleCacheInfo.GetValue(singleCache);

                foreach (DictionaryEntry cacheEntry in entries as Hashtable)
                {
                    var cacheEntryInfo = cacheEntry.Value.GetType().GetField("_value",
                       BindingFlags.NonPublic | BindingFlags.Instance);
                    var value = cacheEntryInfo.GetValue(cacheEntry.Value);
                    if (value.GetType().Name == "CachedRawResponse")
                    {
                        var key = (string)cacheEntry.Value.GetType().BaseType.GetField("_key", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(cacheEntry.Value);
                        key = key.Substring(key.IndexOf("/"));
                        outputCacheEntries.Add(key);
                    }
                }
            }
            foreach (string key in outputCacheEntries)
            {  
                HttpResponse.RemoveOutputCacheItem(key);
            }
        }
4
ответ дан ʞᴉɯ 28 November 2019 в 02:54
поделиться

Вы можете использовать HttpResponse.RemoveOutputCacheItem или HttpResponse.AddCacheItemDependency для аннулирования записей выходного кэша.

.
11
ответ дан 28 November 2019 в 02:54
поделиться

вы можете добавить строку кода HttpResponse.RemoveOutputCacheItem("/YourCachePageName.aspx"); в событие загрузки страницы, загрузки которой вы ожидаете, что кэш страницы слетит.

2
ответ дан 28 November 2019 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: