2012-03-15 3 views
1

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

здесь грубый обзор макета: enter image description here

макеты создан с Balsamiq

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

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

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

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 показывает столько же, что и в два раза больше подтверждения.

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

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

Благодаря

ответ

2

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

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

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

+0

О, ладно, попробуем это сейчас и вернемся немного, спасибо – LocustHorde

+0

Ага !!!! Вот и все! Я не могу сказать, насколько я счастлив, спасибо! – LocustHorde

+2

@LocustHorde Вы очень желанны, проводите много времени с такими проблемами – ntziolis

Смежные вопросы