Один раз в день я хочу, чтобы мой веб-сайт ASP.NET MVC4, который может работать на нескольких серверах, отправлял мне отчет по электронной почте. Это похоже на довольно распространенную вещь, которую хочется сделать, но у меня есть трудное время, подходящее для этого.
Попытка запустить таймер на сервере для выполнения этой работы проблематична по нескольким причинам. Если у меня несколько серверов, тогда у меня будет таймер, работающий на всех из них (в случае, если сервер опустится); Мне нужно будет координировать между ними, что усложняется. Кроме того, попытка доступа к базе данных через Entity Framework из фонового потока добавляет усложнение, которое я должен использовать стратегию блокировки для сериализации конструкции/удаления объекта DbContext между потоком периодического фона и потоком контроллера "переднего плана".
Другой вариант - запустить таймер на серверах, но чтобы поток таймера выполнял GET на волшебную страницу, которая генерирует и отправляет сообщения по электронной почте. Это решает проблему DbContext, потому что доступ к базе данных происходит в обычном действии Controller, сериализованном со всеми другими доступами Controller к базе данных. Но я все еще придерживаюсь проблемы с потенциально более чем одним таймером, поэтому мне нужно было бы немного умений в действии Controller, чтобы игнорировать избыточные запросы отчетов.
Любые предложения? Как обычно это делается?