Comment effectuer un travail périodique sur un site Web ASP.NET MVC?

Une fois par jour, je veux que mon ASP.NET MVC4 site web, qui peut être exécuté sur plusieurs serveurs, pour envoyer un rapport à moi. Cela semble être une chose assez commune envie de le faire, mais je vais avoir un moment difficile à venir avec une bonne façon de le faire.

Essayez d'exécuter une minuterie sur un serveur pour faire ce travail est problématique pour deux raisons. Si j'ai plusieurs serveurs, alors j'aurais la minuterie en cours d'exécution sur tous les d'entre eux (dans le cas d'un serveur tombe en panne); j'avais besoin d'une coordination entre eux, ce qui devient compliqué. Aussi, essayez d'accéder à la base de données via Entity Framework à partir d'un thread d'arrière-plan ajoute la complication que je doit utiliser une stratégie de verrouillage de sérialiser la construction et l'élimination de l'DbContext objet entre le périodique thread d'arrière-plan et le premier plan "" Contrôleur de fil.

Une autre option serait de lancer un timer sur les serveurs, mais à avoir de la minuterie thread effectuer un OBTENIR à la magie de la page qui génère des e-mails et le rapport. Cela résout le DbContext problème, car la base de données accède à se produire dans des conditions normales d'action du Contrôleur, sérialisé avec tous les autres Contrôleur accède à la base de données. Mais je suis toujours coincé avec le problème d'avoir potentiellement plus d'une minuterie en cours, donc j'aurais besoin d'une certaine intelligence dans l'action du Contrôleur d'ignorer redondant rapport à la demande.

Des suggestions? Comment est ce genre de chose fait normalement?

source d'informationauteur Bob.at.Indigo.Health