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
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas faire cette tâche à partir de votre application web, comme Phil Haack bien explique dans
son blog
.Vous pourriez effectuer cette tâche à partir d'un Service de Windows, ou même une application console qui est planifiée pour s'exécuter à intervalles réguliers en utilisant le Planificateur de tâches Windows.
La bonne solution est de créer un service d'arrière-plan qui s'exécute indépendamment de votre site web. Toutefois, si ce n'est pas une option, il s'agit d'un hack, où vous pouvez utiliser le cache comme expliqué dans Facile Tâches en arrière-plan dans ASP.NET par Jeff Atwood.
Quelques options:
Je recommanderais de course Quartz.NET en tant que Service Windows:
Quartz.NET - l'Entreprise Planificateur de tâches .NET Plate-forme
Il y a du code réutilisable pour un Service Windows dans le téléchargement.