2015-07-21 6 views
1

Существует несколько способов использования ASP.Net MVC-ответа/вывода кэширования. В самом простой можно кэшировать простые страницы, которая одинакова для всех:Как работает SetVaryByCustom?

[OutputCache(Duration=24*3600)] // cache 1 day 
public ViewResult Index() ... 

Вы можете варьироваться в зависимости от конкретного Params, вы можете бюст кеша пользовательского ключом. Во всех этих случаях декларативный OutputCacheAttribute используется для определения того, должна ли страница просто служить из кеша. Если он работает от кеша, действие не срабатывает - время CPU сохраняется.

Итак, предположим, что действие принимает идентификатор, то есть его содержимое меняет id на id. Предположим, вы хотите сбросить кеш для определенных идентификаторов, когда их базовые данные меняются. MSDN говорит, чтобы установить VaryByCustom внутри действий, а не декларативно в OutputCacheAttribute:

Response.Cache.SetVaryByCustom

Как:

[OutputCache(Duration=24*3600, VaryByParam="id")] 
public async Task<ViewResult> Thing(string id) 
{ 
    Response.Cache.SetVaryByCustom("thing-" + id); 

    // Some big load of work we'd like to avoid when a ton of visitors hit 
    // the server goes here. 

Так что ... в любом случае, пока это одно, что большая нагрузка работы в Действие пропускается, если страница действительна в кеше. Но, похоже, это не так - если SetVaryByCustom не может прервать действие? Как эта команда работает точно?

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

ответ

1

Основываясь на результатах тестирования, он не работает ни тем, как я предлагал.

В моем действии с этой стратегией применяется, I:

Пожар журнал событий
Огонь SetVaryByCustom (ID);
огонь другой журнал событий

И вот что я увидел:

Browsera: Посещение данность ID
Вход: Оба события огня - до и после того, как
BrowserB: посещениях, такой же идентификатор
Log: (ничего)
Browsera: Изменить идентификатор так что ТЕРЯЕТСЯ огни для ид
BrowserB: Визит ид, видит 200
Вход: Оба события огня - до и после
Browsera: Visit идентификатор, видит 200
Log: (ничего)
BrowserB: Visit идентификатор, видит 304
Вход: (ничего)

Другими словами, все действие не срабатывает, так же, как и в статическом/декларативный подход, при котором все это сделано в OutputCacheAttribute. Что странно, каждый раз, когда он недействителен, ключ получает возможность изменить - вы можете передать новый ключ SetVaryByCustom один раз за аннулирование, но не более.

Если вы явно не указали ASP.Net, браузеру также рекомендуется кэшировать эти страницы в течение продолжительного времени, оставшегося в 24-часовой период (через max-age). Это означает, что в зависимости от того, как ваши посетители приходят, они могут не увидеть изменение страницы, как вы планировали. Вы можете предотвратить это, конечно, с Location=OutputCacheLocation.Server в своем OutputCacheAttribute.

В любом случае, моя основная цель на самом деле встречается - сервер пропускает стоимость процессора для Action - чуть больше, чем я ожидал.