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

У меня работает веб-сайт MVC 3 C#, который извлекает записи из веб-службы. По мере того, как набор данных, который он получает от веб-сервиса, становится все больше и больше, я ищу способ, при котором создание его кеша инициируется не первым пользователем, посещающим сайт, пока нет текущего кеша, а по ежедневному расписанию. (например, работа 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;

    }

редактировать

с помощью 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
}

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

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

  1. Откройте меню "Пуск".
  2. Введите "Планировщик заданий" в поле поиска (в более старых версиях Windows я считаю, что это было найдено в средствах администрирования как "Запланированные задачи"). Откройте результат планировщика заданий.
  3. Щелкните правой кнопкой мыши корневой узел дерева слева - "Планировщик заданий (локальный)" - и выберите "Создать базовое задание".
  4. Дайте заданию название и описание, чтобы вы могли определить его позже. Нажмите кнопку "Далее.
  5. Выберите продолжительность (в вашем случае ежедневно звучит о праве). Нажмите кнопку "Далее.
  6. Измените время начала, если хотите. Нажмите кнопку "Далее.
  7. Оставьте действие как "Запустить программу". Нажмите кнопку "Далее.
  8. Нажмите "Обзор..." и найдите созданный вами исполняемый файл. Нажмите кнопку "Далее.
  9. На последнем экране установите флажок "Открыть диалоговое окно свойств...", а затем "Готово".
  10. Измените параметры безопасности на "Запускать независимо от того, вошел пользователь в систему или нет". При необходимости измените пользователя или группу на соответствующую учетную запись пользователя (ту, которая имеет необходимые разрешения для запуска exe-файла).
  11. Нажмите ОК. Вам будет предложено ввести пароль учетной записи, которая будет запускать задачу. Сделайте это и нажмите ОК.
  12. Нажмите на библиотеку планировщика задач слева. Ваша задача должна появиться в списке справа. Вы можете проверить это, щелкнув правой кнопкой мыши и выбрав Run.
Другие вопросы по тегам