Подтвердить что ты не робот

Как выполнять периодическую работу на веб-сайте ASP.NET MVC?

Один раз в день я хочу, чтобы мой веб-сайт ASP.NET MVC4, который может работать на нескольких серверах, отправлял мне отчет по электронной почте. Это похоже на довольно распространенную вещь, которую хочется сделать, но у меня есть трудное время, подходящее для этого.

Попытка запустить таймер на сервере для выполнения этой работы проблематична по нескольким причинам. Если у меня несколько серверов, тогда у меня будет таймер, работающий на всех из них (в случае, если сервер опустится); Мне нужно будет координировать между ними, что усложняется. Кроме того, попытка доступа к базе данных через Entity Framework из фонового потока добавляет усложнение, которое я должен использовать стратегию блокировки для сериализации конструкции/удаления объекта DbContext между потоком периодического фона и потоком контроллера "переднего плана".

Другой вариант - запустить таймер на серверах, но чтобы поток таймера выполнял GET на волшебную страницу, которая генерирует и отправляет сообщения по электронной почте. Это решает проблему DbContext, потому что доступ к базе данных происходит в обычном действии Controller, сериализованном со всеми другими доступами Controller к базе данных. Но я все еще придерживаюсь проблемы с потенциально более чем одним таймером, поэтому мне нужно было бы немного умений в действии Controller, чтобы игнорировать избыточные запросы отчетов.

Любые предложения? Как обычно это делается?

4b9b3361

Ответ 1

Вы не должны делать эту задачу из своего веб-приложения, так как Phil Haack прекрасно объясняет это в his blog post.

Как обычно это делается?

Вы можете выполнить эту задачу из Службы Windows или даже консольного приложения, которое планируется запустить через регулярные промежутки времени с помощью Планировщика Windows.

Ответ 2

Правильное решение - создать фоновый сервис, который работает независимо от вашего веб-сайта. Однако, если это не вариант, есть хак, в котором вы можете использовать кеш, как описано в Easy Background Tasks в ASP.NET Джеффом Этвудом.

Ответ 3

Я бы рекомендовал запустить Quartz.NET в качестве службы Windows:

Quartz.NET - Enterprise Job Scheduler for .NET Platform

Имеется шаблон шаблона для службы Windows в процессе загрузки.

Ответ 4

Несколько вариантов:

  • Если вы размещаете на Azure как веб-сайт, просмотрите WebJobs, который был недавно выпущен в предварительном просмотре (http://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/)
  • Если вам не нужна боль извлечения вашей логики электронной почты за пределами веб-сайта, выставляйте эту функцию на URL-адресе (с обработчиком, действием mvc и т.д.), а затем запустите задачу Windows Scheduled, которая попадает в этот URL-адрес по расписанию.
  • Напишите простое консольное приложение, которое выполняется аналогично с помощью задачи Windows Scheduled.
  • Или напишите простую службу Windows, которая внутренне зацикливается и проверяет время и когда достигнуто, попадает в этот URL-адрес, запускает этот exe или имеет собственный код для отправки вам электронной почты.