Избегайте выполнения кэшированных контролов при обратной передаче - PullRequest
1 голос
/ 15 марта 2012

У меня есть настраиваемая страница блога, а в правой части страницы есть «панель», на которой отображаются самые популярные блоги, а другая - с людьми, получившими наибольшее количество голосов в своих блогах на прошлой неделе, и еще три таких вещи.Все эти панели тяжелые;загрузка занимает пару секунд.

Вот приблизительный обзор макета: enter image description here

макетов, созданных с помощью Balsamiq

Поскольку они не обязаны меняться так часто, я выделил их всех в веб-элементы управления (.ascx), и у них у всех есть выходной кеш:

<%@ OutputCache Duration="7200" VaryByParam="*" VaryByCustom="CacheByModule" %>

И в global.asax IПолучил это, чтобы соответствовать моей пользовательской переменной кэша:

    public override string GetVaryByCustomString(HttpContext context, string custom)
    {
    switch (custom.ToLower())
    {
        case "cachebymodule":
            Request.Url.PathAndQuery.Split('/')[0];
            break;
    }

            return base.GetVaryByCustomString(context, custom);
    }

По сути, я делаю то же самое для разных частей моего сайта, блогов, опросов, опросов, викторины и т. д.

Когда я запускаю свою страницу в первый раз, все они выполняются - что ожидается.При следующем запуске - ни один из них не будет выполнен, что также ожидается.

Теперь, это происходит каждый раз, когда я комментирую или отвечаю на блоге, который является событием обратной отправки, и я использую ajaxОбновление панели для раздела комментариев, все мои правые панели выполняются!

Откуда я знаю это?хорошо, если я отлаживаю приложение, точки останова в них удаляются для ответа и удаления (события обратной передачи).SQL Profiler показывает столько же, что в два раза больше подтверждений.

Это ожидаемое поведение?Весь смысл их кеширования в том, что они никогда не выполняются ... и тем не менее, при каждом ответе и удалении они выполняются.Только время, когда они не выполняются, находится при загрузке новой страницы (и в пределах ограничения по времени кэша)

Итак, почему это выполняется на обратных передачах?и как мне этого избежать, пожалуйста?

Спасибо

1 Ответ

2 голосов
/ 15 марта 2012

Причина, по которой он выполняется, заключается в том, что параметры URL + не совпадают для PageLoad / PostBack, поэтому кэширование вывода не работает.
Вы можете попробовать установить OutputCache VaryByParam="None", чтобы избежать сброса при изменении URL.

<%@ OutputCache Duration="7200" VaryByParam="None" VaryByCustom="CacheByModule" %>

В зависимости от того, что CacheByModule делает, это должно работать.

...