Как мне предварительно заполнить выходной кэш в веб-приложении asp.net?

Я использую директиву страницы outputcache для кеширования значений на основе VaryByParam. Есть ли способ предварительно заполнить кеш при запуске веб-приложения для набора общих параметров вместо того, чтобы ждать, пока пользователь перейдет на страницу? Или мне просто нужно написать сценарий, который обрабатывает все страницы, которые я хочу кэшировать? В идеале я могу сделать это на сервере где-нибудь в global.asax application_start?


person Community    schedule 07.10.2009    source источник


Ответы (3)


Очевидно, сейчас вы заинтересованы в решении, но посмотрите, что будет в ASP.NET 4. Есть два новых дополнения, которые могут вам помочь.

Во-первых, это возможность указать логику «разогрева» для приложений ASP.NET - вы настраиваете это в web.config и, при необходимости, указываете ему запускать код, реализующий IProcessHostPreloadClient. Подробнее см. Здесь: http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx

Во-вторых, вы получите подходящую модель поставщика для кэширования вывода. До сих пор был только один вариант: кеширование в рабочем процессе. Таким образом, каждый раз, когда происходит переработка, вы теряете свой кеш (и, конечно, вы ограничены ограничениями памяти). В ASP.NET 4 вы также получаете кэширование на основе диска из коробки. Подробнее см. Здесь: http://www.asp.net/learn/whitepapers/aspnet40/#_TOC1_2

person pattermeister    schedule 07.10.2009
comment
Я не верю, что кэширование на дисках из коробки можно получить. Microsoft никогда не выпускала дисковый кеш - вам нужно написать свою собственную реализацию System.Web.Caching.OutputCacheProvider. - person Tom Lianza; 15.06.2011

Раньше я использовал сценарии разминки

http://programmerramblings.blogspot.com/2008/09/aspnet-site-warmup.html

Подобное решение будет в основном "пинговать" любую страницу. Этот «пинг» приведет к активации вашего кеша. Это также предотвратит переход пользователей на холодный веб-сайт, поэтому страницы будут полностью дрожать к тому времени, когда они туда попадут.

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

string[] cachedPages = new string[] { "http://...", "http://...", ...};

foreach (var url in cachePages) {
    var request = WebRequest.Create(url);
    request.BeginGetResponse(null, null);
}
person Bob    schedule 07.10.2009
comment
Да, это сработает, но это означает, что сценарий разогрева не является частью application_start, что в идеале находится там, где я бы хотел. Что, если IIS перезапустится? Я нахожусь в ситуации, когда у меня нет контроля над ящиком, на котором находится веб-сайт, поэтому я бы хотел, чтобы все было автономно в серверном приложении. - person ; 08.10.2009
comment
Я могу думать только о способах взлома, чтобы получить его при запуске приложения. В зависимости от страниц и трафика на сайт я могу создать запланированное задание на моем локальном компьютере, чтобы пинговать сайт через частые интервалы. - person Bob; 08.10.2009
comment
Я обновил свой ответ, чтобы показать простой код для разогрева при запуске приложения. Вроде должно сработать, но что-то мне не нравится. - person Bob; 08.10.2009
comment
Хм, это может сработать, хотя это кажется немного рекурсивным или что-то в этом роде - также я не знаю ограничений на исходящие HTTP-запросы с сервера. Думаю, там есть дроссель. Проведем расследование и ответим. - person ; 08.10.2009
comment
Как насчет установки таймера или добавления записи кэша (и подключения события истечения срока действия) в Application_Start, а также того, чтобы обратный вызов THAT выполнял итерацию страниц, которые нуждаются в разогреве? Это позволит вам автоматически запускаться, но при этом небольшая задержка в AppStart. - person IDisposable; 03.04.2012
comment
Привет, ризом, как предложенный подход сработал для вас? - person MaksymD; 09.07.2015

Зачем вам кэшировать вещи до того, как кто-то их действительно запросит? Разве это тоже не расходует ресурсы?

Я не уверен, что вы действительно можете кэшировать страницу динамически, как вы говорите, но вы можете добавлять объекты в кеш в файле Global.asax.

void Application_Start(object sender, EventArgs e) 
{

}
person Jack Marchetti    schedule 07.10.2009
comment
Что ж, в этом сценарии я знаю, что они собираются запросить. Да, я знаю, что могу добавить переменную кеша, но я хочу добавить кэш вывода. - person ; 08.10.2009
comment
Как он упоминал, он хочет предварительно заполнить кеш набором общих значений - вещи, которые, как он знает, будут запрошены. Таким образом, когда пользователь действительно попадает на сайт с этим запросом, у этого пользователя не возникает задержек, пока элемент извлекается и кэшируется. - person StriplingWarrior; 08.10.2009