Запланировать задачу, обновляющую HttpContext.Cache каждый день в определенное время

У меня запущен веб-сайт MVC 3 С#, который извлекает записи из веб-службы. Поскольку набор данных, который он получает от веб-службы, становится все больше и больше, я ищу способ, которым создание кеша не запускается первым пользователем для посещения сайта, пока нет текущего кеша, но по ежедневному графику (например, задание cron, запланированное задание или что-то еще).

Как мне это сделать? Мне нужна какая-то библиотека запуска, например Quartz.net? (Я бы предпочел использовать более простое решение)

Теперь у меня в контроллере есть:

private List<DataSummary> GetSummaries()
    {
        //get summaries from cache if available
        List<DataSummary> summaries = (List<DataSummary>)HttpContext.Cache["SummariesCache"];
        if (summaries == null)
        {
            //cache empty, retrieve values
            summaries = _webservice.GetSummaries();
            //cache it
            HttpContext.Cache.Add("SummariesCache", summaries, null, DateTime.Now.AddHours(12), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
        }
        return summaries;

    }

Edit

с использованием CacheItemRemovedCallback вызывает ошибки времени ожидания

Ответ 1

Это немного хакерское решение, но вы всегда можете создать запланированную задачу на сервере, который запускает исполняемый файл. Этот исполняемый файл удаляет определенный URL-адрес вашего веб-сайта, который, в свою очередь, заполняет кеш точно так, как вы указали выше. Чтобы попасть в URL-адрес исполняемого файла, вам нужно что-то в этом направлении:

var req = (HttpWebRequest)WebRequest.Create(URL);
req.Timeout = 30000;        
req.KeepAlive = false;
req.Method = "GET";
var res = (HttpWebResponse)req.GetResponse();
if (res.StatusCode == HttpStatusCode.OK){
    // Your cache should be refreshed
}

Создание запланированной задачи также довольно просто - просто убедитесь, что вы запустили ее в учетной записи пользователя, которая имеет разрешения на выполнение для exe, которую вы создаете, и не требуете входа пользователя для запуска задачи.

Изменить: добавлено руководство по настройке запланированной задачи в Windows Server 2008

  • Откройте меню "Пуск".
  • Введите "Планировщик заданий" в окне поиска (в старых версиях Windows я считаю, что это было найдено в "Администрирование" как "Запланированные задания" ). Откройте результат планировщика заданий.
  • Щелкните правой кнопкой мыши корень node дерева слева - "Планировщик заданий (локальный)" - и выберите "Создать основную задачу".
  • Дайте задаче имя и описание, чтобы впоследствии определить его. Нажмите Далее.
  • Выберите продолжительность (в вашем случае ежедневные звуки о праве). Нажмите Далее.
  • Измените время начала, если хотите. Нажмите Далее.
  • Оставьте действие "Начать программу". Нажмите Далее.
  • Нажмите "Обзор..." и найдите исполняемый файл, который вы создали. Нажмите Далее.
  • На последнем экране поставьте галочку в поле "Открыть диалог свойств...", затем "Готово".
  • Измените параметры безопасности на "Запустить, был ли пользователь включен или нет". При необходимости измените пользователя или группу на соответствующую учетную запись пользователя (с необходимыми разрешениями для запуска exe).
  • Нажмите "ОК". Вам будет предложено ввести пароль учетной записи, который запустит задачу. Сделайте это и нажмите "ОК".
  • Нажмите на библиотеку планировщика заданий слева. Ваша задача должна появиться в списке справа. Вы можете проверить его, щелкнув правой кнопкой мыши и выбрав "Выполнить".