Aujourd'hui, nous avons créé une application console pour exécuter les tâches planifiées de notre site Web ASP.NET. Mais je pense que cette approche est un peu sujette aux erreurs et difficile à maintenir. Comment exécutez-vous votre tâche planifiée (dans un environnement Windows / IIS / ASP.NET)
Mettre à jour:
Exemples de tâches:
- Envoi de courriels à partir d'une file d'attente de courriels dans la base de données
- Suppression d'objets obsolètes de la base de données
- Récupérer les statistiques de Google AdWords et remplir un tableau dans la base de données.
asp.net
windows
iis
scheduled-tasks
Niels Bosma
la source
la source
Réponses:
Toutes mes tâches (qui doivent être planifiées) pour un site Web sont conservées dans le site Web et appelées à partir d'une page spéciale. J'ai ensuite écrit un service Windows simple qui appelle cette page de temps en temps. Une fois la page lancée, elle renvoie une valeur. Si je sais qu'il y a encore du travail à faire, je lance à nouveau la page tout de suite, sinon je l'exécute dans un petit moment. Cela a très bien fonctionné pour moi et conserve toute ma logique de tâche avec le code Web. Avant d'écrire le service Windows simple, j'ai utilisé le planificateur Windows pour appeler la page toutes les x minutes.
Un autre moyen pratique d'exécuter cela consiste à utiliser un service de surveillance comme Pingdom . Pointez leur vérification http vers la page qui exécute votre code de service. Demandez à la page de renvoyer des résultats qui peuvent ensuite être utilisés pour déclencher Pingdom pour envoyer des messages d'alerte lorsque quelque chose ne va pas.
la source
Cette technique de Jeff Atwood pour Stackoverflow est la méthode la plus simple que j'ai rencontrée. Il repose sur le mécanisme de rappel «Élément de cache supprimé» intégré au système de cache d'ASP.NET
Mise à jour: Stackoverflow a dépassé cette méthode. Cela ne fonctionne que lorsque le site Web fonctionne, mais c'est une technique très simple qui est utile pour de nombreuses personnes.
Consultez également Quartz.NET
la source
No, we’ve switched to a dedicated task. We definitely outgrew this technique. I do think it’s fine for small sites though!
- Jeff AtwoodCréez un service Windows personnalisé .
J'ai eu des tâches stratégiques définies en tant qu'applications de console planifiées et je les ai trouvées difficiles à maintenir. J'ai créé un service Windows avec un «battement de cœur» qui vérifierait un calendrier dans ma base de données toutes les deux minutes. Cela a très bien fonctionné.
Cela dit, j'utilise toujours des applications de console planifiées pour la plupart de mes tâches de maintenance non critiques. Si ce n'est pas cassé, ne le réparez pas.
la source
J'ai trouvé que c'était facile pour toutes les personnes impliquées:
En utilisant cette méthodologie, toute la logique métier est contenue dans votre application Web, mais vous avez la fiabilité du gestionnaire de tâches Windows ou de tout autre gestionnaire de tâches commerciales pour le lancer et enregistrer toutes les informations de retour telles qu'un rapport d'exécution. L'utilisation d'un service Web au lieu de publier sur une page présente un certain avantage, car il est plus facile d'obtenir des données de retour d'un service Web.
la source
Pourquoi réinventer la roue, utilisez la classe Threading et Timer.
la source
Utilisez le planificateur Windows pour exécuter une page Web.
Pour empêcher les utilisateurs malveillants ou les robots des moteurs de recherche de l'exécuter, lorsque vous configurez la tâche planifiée, il vous suffit d'appeler la page Web avec une chaîne de requête, c'est-à-dire: mypage.aspx? From = scheduletask
Ensuite, dans le chargement de la page, utilisez simplement une condition: if (Request.Querystring ["from"] == "schedtask") {// executetask}
De cette façon, aucune araignée de moteur de recherche ou utilisateur malveillant ne pourra exécuter votre tâche planifiée.
la source
Request.IsLocal
>> seul le serveur lui-même peut exécuter les tâches planifiées, personne d'autre.Cette bibliothèque fonctionne comme un charme http://www.codeproject.com/KB/cs/tsnewlib.aspx
Il vous permet de gérer les tâches planifiées de Windows directement via votre code .NET.
la source
De plus, si votre application utilise SQL SERVER, vous pouvez utiliser l'Agent SQL pour planifier vos tâches. C'est là que nous mettons généralement du code récurrent basé sur les données (rappels par e-mail, maintenance planifiée, purges, etc.). Une excellente fonctionnalité intégrée à l'agent SQL est les options de notification d'échec, qui peuvent vous alerter en cas d'échec d'une tâche critique.
la source
Je ne sais pas de quel type de tâches planifiées vous parlez. Si vous voulez dire des choses comme "toutes les heures, actualisez les tâches de type foo.xml", utilisez le système de tâches planifiées de Windows. (La commande "at", ou via le contrôleur.) Demandez-lui d'exécuter une application console ou de demander une page spéciale qui démarre le processus.
Modifier: je devrais ajouter, c'est une bonne façon de faire fonctionner votre application IIS aux points planifiés. Supposons donc que vous souhaitiez vérifier votre base de données toutes les 30 minutes et envoyer des rappels par e-mail aux utilisateurs concernant certaines données, vous pouvez utiliser des tâches planifiées pour demander cette page et ainsi obtenir des éléments de traitement IIS.
Si vos besoins sont plus complexes, vous pourriez envisager de créer un service Windows et de le faire exécuter une boucle pour effectuer le traitement dont vous avez besoin. Cela présente également l'avantage de séparer le code à des fins de mise à l'échelle ou de gestion. À la baisse, vous devez gérer les services Windows.
la source
Si vous possédez le serveur, vous devez utiliser le planificateur de tâches Windows. Utilisez AT /? à partir de la ligne de commande pour voir les options.
Sinon, à partir d'un environnement basé sur le Web, vous devrez peut-être faire quelque chose de méchant comme configurer une autre machine pour effectuer des requêtes vers une certaine page sur un intervalle de temps.
la source
J'ai utilisé Abidar avec succès dans un projet ASP.NET (voici quelques informations générales ).
Le seul problème avec cette méthode est que les tâches ne s'exécuteront pas si l'application Web ASP.NET est déchargée de la mémoire (c'est-à-dire en raison d'une faible utilisation). J'ai essayé de créer une tâche pour frapper l'application Web toutes les 5 minutes, mais cela ne semble pas fonctionner de manière fiable, alors maintenant j'utilise le planificateur Windows et l'application de base pour le faire à la place.
La solution idéale consiste à créer un service Windows, bien que cela ne soit pas possible (par exemple, si vous utilisez un environnement d'hébergement partagé). Cela facilite également les choses du point de vue de la maintenance pour garder les choses dans l'application Web.
la source
Voici une autre façon:
1) Créez un script Web "Heartbeat" qui est responsable du lancement des tâches si elles sont DUE ou en retard pour être lancées.
2) Créez un processus planifié quelque part (de préférence sur le même serveur Web) qui frappe le webscript et le force à s'exécuter à intervalle régulier. (par exemple, la tâche de planification de Windows qui lance silencieusement le script de heatbeat en utilisant IE ou quoi que ce soit)
Le fait que le code de tâche soit contenu dans un script Web est purement dans le but de conserver le code dans la base de code de l'application Web (l'hypothèse est que les deux dépendent les uns des autres), ce qui serait plus facile à gérer pour les développeurs Web. .
L'approche alternative consiste à créer un script / programme de serveur exécutable qui effectue tout le travail de planification lui-même et exécute l'exécutable lui-même en tant que tâche planifiée. Cela peut permettre un découplage fondamental entre l'application Web et la tâche planifiée. Par conséquent, si vous avez besoin que vos tâches planifiées s'exécutent même dans le cas où l'application Web / la base de données pourrait être en panne ou inaccessible, vous devriez opter pour cette approche.
la source
Vous pouvez facilement créer un service Windows qui exécute du code à intervalle à l'aide de la méthode «ThreadPool.RegisterWaitForSingleObject». Il est vraiment lisse et assez facile à installer. Cette méthode est une approche plus rationalisée que d'utiliser l'un des temporisateurs du cadre.
Jetez un œil au lien ci-dessous pour plus d'informations:
Exécution d'un processus périodique dans .NET à l'aide d'un service Windows:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html
la source
Nous utilisons également des applications de console. Si vous utilisez des outils de journalisation comme Log4net, vous pouvez surveiller correctement leur exécution. De plus, je ne sais pas comment ils sont plus difficiles à maintenir qu'une page Web, étant donné que vous pouvez partager certaines des mêmes bibliothèques de code entre les deux si elles sont conçues correctement.
Si vous ne souhaitez pas que ces tâches soient exécutées de manière chronométrée, vous pouvez avoir une page Web dans votre section administrative de votre site Web qui fait office de file d'attente. L'utilisateur soumet une demande d'exécution de la tâche, à son tour, il insère un enregistrement d'horodatage vierge sur la table MyProcessQueue et votre tâche planifiée vérifie toutes les X minutes pour un nouvel enregistrement dans MyProcessQueue. De cette façon, il ne s'exécute que lorsque le client le souhaite.
J'espère que ces suggestions vous aideront.
la source
Une option serait de configurer un service Windows et de le faire appeler votre tâche planifiée.
Dans les formes de Win que j'ai utilisées, les Timers ne pensent pas que cela fonctionnerait bien dans ASP.NET
la source
Une nouvelle bibliothèque de classes du planificateur de tâches pour .NET
Remarque: Depuis la création de cette bibliothèque, Microsoft a introduit un nouveau planificateur de tâches (Task Scheduler 2.0) pour Windows Vista. Cette bibliothèque est un wrapper pour l'interface Task Scheduler 1.0, qui est toujours disponible dans Vista et est compatible avec Windows XP, Windows Server 2003 et Windows 2000.
http://www.codeproject.com/KB/cs/tsnewlib.aspx
la source