2009-09-08 19 views
12

Requerimos que en una aplicación ASP.Net, se debe invocar un proceso .Net todos los días a una hora automáticamente Este proceso necesita interactuar con la base de datos (SQL Server 2005) y generar facturación diariamente. Estamos utilizando un alojamiento compartido, por lo tanto, no podemos crear un servicio de Windows o crear trabajos de SQL Server. ¿Cómo se puede lograr esto sin la intervención del usuario?¿Hay alguna manera de ejecutar un proceso todos los días en una aplicación web .Net sin escribir un servicio de Windows o trabajos de servidor SQL?

Respuesta

12

Usted podría intentar the technique described here, utilizado en stackoverflow sí mismo (o al menos se utiliza aquí en un punto). En pocas palabras:

  1. En el inicio, añadir un elemento a la HttpRuntime.Cache con un de vencimiento fijo.
  2. Cuando caduque el elemento, haga su trabajo, como WebRequest o qué tiene usted.
  3. Vuelva a agregar el elemento a la memoria caché con una caducidad fija.

Para conseguir que se ejecute en un momento específico en lugar de un intervalo, se podría reducir el intervalo y simplemente modificar su método de trabajo para comprobar el tiempo mismo.


Como los comentarios en el artículo original vinculado anteriormente nota, esto no es una solución perfecta, y nadie debe preferir que a través de una técnica de programación adecuada si hay uno disponible. Ver When Does Asp.Net Remove Expired Cache Items? para algunas calificaciones adicionales.

+0

Los tiempos de caducidad fijos no son fijos ... solo * en realidad * caducan cuando intenta ACCEDER al ítem en caché nuevamente. Eso está bien para un sitio de tráfico constante como SO, pero no es confiable para sitios donde no se puede depender del tráfico para hacer ping al sitio lo suficientemente cerca después de la caducidad (y pulsar el elemento de caché para que caduque) para realizar el trabajo cuando necesito. – richardtallent

+0

@richardtallent: eso no es correcto, aunque el mecanismo de caducidad de la caché es más complicado de lo que pensaba y requiere más consideración antes de usarlo a ciegas. Vea el enlace que agregué a mi respuesta para más detalles. –

+0

@jeff: ¡lee tu enlace ayer, excelente investigación! – richardtallent

2

Siempre se puede programar una tarea para ejecutar un servicio web ..

http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx

El planificador se ejecute un archivo VBS con la siguiente ..

Set oServerXML = CreateObject("Msxml2.ServerXMLHTTP") 
oServerXML.Open "GET","http://my.hostedservice.com/myService.asmx/myService?aParam=Value 
oServerXML.setRequestHeader "Content-Type","application/x-www-form-urlencoded" 
oServerXML.Send 
Set oServerXML = nothing 
+1

dijo que está en hosting compartido, por lo que no hay manera de acceder a la programación de Windows –

+2

La tarea programada se ejecutará en otro servidor. – madcolor

+0

Si está en otro servidor, también funcionará –

0

Se puede utilizar una tarea programada , pero esto podría no funcionar en un entorno de alojamiento compartido tampoco.

Puede configurar un servicio web o una página en su sitio web para iniciar el proceso, luego haga que una tarea programada en una computadora de escritorio acceda a esa página/servicio una vez al día para iniciar el proceso. Hacky, pero podría funcionar.

1

No se puede hacer, por desgracia.

IIS solo responde a las solicitudes, y SQL Server solo se activa para las tareas.

Lo más cerca que podrá hacer es poner su rutina en una página ASPX, no vinculada desde el sitio y no con un nombre obvio, y desencadenarla mediante una solicitud desde alguna otra máquina en Internet.

La otra máquina podría ser Windows, Linux, Mac, lo que sea que tenga disponible, y todas esas plataformas tienen formas de programar eventos (servicio, cron, etc.) que pueden hacer que la solicitud active la actualización en el servidor.

3

Sí, use Windows Scheduler. Según cómo esté configurado, es posible que deba iniciar sesión para que se ejecute el planificador.

+3

en el alojamiento compartido. No hay manera de acceder a la programación de Windows –

+0

. Pero existe la opción de colocar un servicio web en el entorno de alojamiento y luego tener un cuadro externo siempre activado invocarlo. –

0

Siendo .NET ignorante, me imagino que hay algún tipo de planificador basado en .NET disponible para esto (al igual que Quartz para Java).

O simplemente podría disparar un hilo de larga duración que pasa la mayor parte del tiempo durmiendo, despertarse cada minuto, controlar la hora, consultar su lista de "cosas que hacer", disparar los que necesitan ser hecho. El nivel de sofisticación debe ser tan alto como lo desee, pero el objetivo principal es mantener el hilo de programación primaria "vivo", "a toda costa".

0

lo que puedo pensar ahora son:

  • Crear una DLL que contiene la lógica programación que desea, y crea seguro de que esta función de programación DLL no se detendrá y se repetirá para siempre, entonces necesitará una página en ese servidor esta página activará estas funciones dll . "Deberá llamar al esta página al menos una vez para iniciar el planificador ".

  • Crear una aplicación "sostiene la lógica de programación" en la otra máquina, puede ser el PC de casa, y hacer su aplicación para PC llamar a las funciones del servidor a través de servicios web o páginas

1

Hay maneras de ejecutar "servicios" en .Net utilizando caducidad de caché para desencadenar la tarea.

More at CodeProject

Cuestiones relacionadas