Hoy hemos creado una aplicación de consola para ejecutar las tareas programadas para nuestro sitio web ASP.NET. Pero creo que este enfoque es un poco propenso a errores y difícil de mantener. ¿Cómo ejecuta su tarea programada (en un entorno Windows / IIS / ASP.NET)
Actualizar:
Ejemplos de tareas:
- Enviar correo electrónico desde una cola de correo electrónico en la base de datos
- Eliminar objetos obsoletos de la base de datos
- Recuperar estadísticas de Google AdWords y llenar una tabla en la base de datos.
asp.net
windows
iis
scheduled-tasks
Niels Bosma
fuente
fuente
Respuestas:
Todas mis tareas (que deben programarse) para un sitio web se mantienen dentro del sitio web y se llaman desde una página especial. Luego escribí un servicio simple de Windows que llama a esta página de vez en cuando. Una vez que la página se ejecuta, devuelve un valor. Si sé que hay más trabajo por hacer, vuelvo a ejecutar la página, de lo contrario, la ejecuto en un momento. Esto me ha funcionado muy bien y mantiene toda mi lógica de tareas con el código web. Antes de escribir el sencillo servicio de Windows, utilicé el programador de Windows para llamar a la página cada x minutos.
Otra forma conveniente de ejecutar esto es usar un servicio de monitoreo como Pingdom . Apunte su verificación de http a la página que ejecuta su código de servicio. Haga que la página devuelva resultados que luego se pueden usar para hacer que Pingdom envíe mensajes de alerta cuando algo no está bien.
fuente
Esta técnica de Jeff Atwood para Stackoverflow es el método más simple que he encontrado. Se basa en el mecanismo de devolución de llamada "elemento de caché eliminado" integrado en el sistema de caché de ASP.NET
Actualización: Stackoverflow ha superado este método. Solo funciona mientras el sitio web se está ejecutando, pero es una técnica muy simple que es útil para muchas personas.
También echa un vistazo a Quartz.NET
fuente
No, we’ve switched to a dedicated task. We definitely outgrew this technique. I do think it’s fine for small sites though!
- Jeff AtwoodCrea un servicio personalizado de Windows .
Tenía algunas tareas de misión crítica configuradas como aplicaciones de consola programadas y las encontré difíciles de mantener. Creé un servicio de Windows con un 'latido' que verificaría un horario en mi base de datos cada dos minutos. Funcionó muy bien.
Dicho esto, todavía uso aplicaciones de consola programadas para la mayoría de mis tareas de mantenimiento no críticas. Si no está roto, no lo arregles.
fuente
He encontrado que esto es fácil para todos los involucrados:
Al usar esta metodología, toda la lógica de negocios está contenida en su aplicación web, pero tiene la confiabilidad del administrador de tareas de Windows o de cualquier otro administrador de tareas comerciales para iniciarlo y registrar cualquier información de devolución, como un informe de ejecución. Usar un servicio web en lugar de publicar en una página tiene una pequeña ventaja porque es más fácil obtener datos de retorno de un servicio web.
fuente
Por qué reinventar la rueda, use la clase Threading y Timer.
fuente
Use el Programador de Windows para ejecutar una página web.
Para evitar que el usuario malicous o las arañas de los motores de búsqueda lo ejecuten, cuando configure la tarea programada, simplemente llame a la página web con una cadena de consulta, es decir: mypage.aspx? From = Scheduledtask
Luego, en la carga de la página, simplemente use una condición: if (Request.Querystring ["from"] == "Scheduledtask") {// executetask}
De esta manera, ninguna araña de motor de búsqueda o usuario malintencionado podrá ejecutar su tarea programada.
fuente
Request.IsLocal
>> solo el servidor mismo puede ejecutar las tareas programadas, nadie más.Esta biblioteca funciona como un encanto http://www.codeproject.com/KB/cs/tsnewlib.aspx
Le permite administrar tareas programadas de Windows directamente a través de su código .NET.
fuente
Además, si su aplicación usa SQL SERVER, puede usar el Agente SQL para programar sus tareas. Aquí es donde comúnmente ponemos código recurrente basado en datos (recordatorios por correo electrónico, mantenimiento programado, purgas, etc.). Una gran característica integrada con el Agente SQL son las opciones de notificación de fallas, que pueden alertarlo si falla una tarea crítica.
fuente
No estoy seguro de a qué tipo de tareas programadas te refieres. Si quiere decir cosas como "cada hora, actualice las tareas de tipo foo.xml", utilice el sistema de Tareas Programadas de Windows. (El comando "at" o mediante el controlador). Ejecute una aplicación de consola o solicite una página especial que inicie el proceso.
Editar: debo agregar, esta es una buena manera de hacer que su aplicación IIS también se ejecute en los puntos programados. Supongamos que desea verificar su base de datos cada 30 minutos y enviar recordatorios por correo electrónico a los usuarios sobre algunos datos, puede usar tareas programadas para solicitar esta página y, por lo tanto, obtener el procesamiento de IIS.
Si sus necesidades son más complejas, puede considerar crear un servicio de Windows y hacer que se ejecute un bucle para hacer cualquier procesamiento que necesite. Esto también tiene la ventaja de separar el código para fines de escalado o administración. En el lado negativo, debe lidiar con los servicios de Windows.
fuente
Si posee el servidor, debe usar el programador de tareas de Windows. Utilice AT /? desde la línea de comando para ver las opciones.
De lo contrario, desde un entorno basado en la web, es posible que tenga que hacer algo desagradable como configurar una máquina diferente para realizar solicitudes a una determinada página en un intervalo de tiempo.
fuente
He usado Abidar con éxito en un proyecto ASP.NET (aquí hay información de fondo ).
El único problema con este método es que las tareas no se ejecutarán si la aplicación web ASP.NET se descarga de la memoria (es decir, debido al bajo uso). Una cosa que intenté es crear una tarea para acceder a la aplicación web cada 5 minutos, mantenerla viva, pero esto no parece funcionar de manera confiable, por lo que ahora estoy usando el programador de Windows y la aplicación de consola básica para hacerlo.
La solución ideal es crear un servicio de Windows, aunque esto podría no ser posible (es decir, si está utilizando un entorno de alojamiento compartido). También facilita un poco las cosas desde una perspectiva de mantenimiento para mantener las cosas dentro de la aplicación web.
fuente
Aquí hay otra forma:
1) Cree una secuencia de comandos web "heartbeat" que se encargue de iniciar las tareas si están DEBIDAS o atrasadas para su lanzamiento.
2) Cree un proceso programado en algún lugar (preferiblemente en el mismo servidor web) que llegue al script web y lo obligue a ejecutarse a intervalos regulares. (p. ej., tarea de programación de Windows que lanza silenciosamente el script de heatbeat usando IE o whathaveyou)
El hecho de que el código de la tarea esté contenido dentro de un script web es simplemente por mantener el código dentro de la base de código de la aplicación web (se supone que ambos dependen el uno del otro), lo que sería más fácil de administrar para los desarrolladores web .
El enfoque alternativo es crear un script / programa ejecutable del servidor que haga que todo el programa funcione por sí mismo y ejecutar el ejecutable como una tarea programada. Esto puede permitir un desacoplamiento fundamental entre la aplicación web y la tarea programada. Por lo tanto, si necesita que sus tareas programadas se ejecuten incluso en el caso de que la aplicación web / base de datos pueda estar inactiva o inaccesible, debe seguir este enfoque.
fuente
Puede crear fácilmente un servicio de Windows que ejecute código en intervalos utilizando el método 'ThreadPool.RegisterWaitForSingleObject'. Es realmente elegante y bastante fácil de configurar. Este método es un enfoque más simplificado que el uso de cualquiera de los temporizadores en el marco.
Eche un vistazo al siguiente enlace para obtener más información:
Ejecución de un proceso periódico en .NET utilizando un servicio de Windows:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html
fuente
Usamos aplicaciones de consola también. Si utiliza herramientas de registro como Log4net, puede supervisar correctamente su ejecución. Además, no estoy seguro de cómo son más difíciles de mantener que una página web, dado que puede compartir algunas de las mismas bibliotecas de código entre los dos si está diseñado correctamente.
Si está en contra de que esas tareas se ejecuten de manera programada, podría tener una página web en su sección administrativa de su sitio web que actúe como una cola. El usuario realiza una solicitud para ejecutar la tarea, a su vez inserta un registro de sello de fecha en blanco en la tabla MyProcessQueue y su tarea programada verifica cada X minutos un nuevo registro en MyProcessQueue. De esa manera, solo se ejecuta cuando el cliente quiere que se ejecute.
Espero que esas sugerencias ayuden.
fuente
Una opción sería configurar un servicio de Windows y hacer que llame a su tarea programada.
En winforms he usado Timers puesto, no creo que esto funcione bien en ASP.NET
fuente
Una nueva biblioteca de clases del programador de tareas para .NET
Nota: Desde que se creó esta biblioteca, Microsoft ha introducido un nuevo programador de tareas (Task Scheduler 2.0) para Windows Vista. Esta biblioteca es un contenedor para la interfaz Task Scheduler 1.0, que todavía está disponible en Vista y es compatible con Windows XP, Windows Server 2003 y Windows 2000.
http://www.codeproject.com/KB/cs/tsnewlib.aspx
fuente