2011-02-08 33 views
14

Estoy desarrollando mi primera aplicación web utilizando ASP.Net MVC, y estoy en una situación en la que me gustaría que un servicio en segundo plano pueda procesar notificaciones de estado fuera de la aplicación, similar al sistema de reputación/insignia en stackoverflow.¿Cómo implementar el procesamiento en segundo plano para el sitio web ASP.Net MVC en un entorno de alojamiento compartido?

¿Cuál es la mejor manera de manejar algo como esto? ¿Es posible incluso en un entorno de alojamiento compartido como GoDaddy, que estoy usando?

No necesito comunicarme directamente con el trabajador de fondo, ya que agregaré registros de notificación a una tabla de base de datos con una columna establecida en un estado "no procesado". Luego, el trabajador escaneará la tabla en un horario regular y procesará lo que está listo.

Gracias por su consejo.

+0

¿Podría decirnos más sobre el trabajo en segundo plano? ¿Tarda mucho? ¿Es una CPU intensiva? ¿Cuáles son las razones principales por las que no puedes ejecutarlo junto con la solicitud? –

+0

Claro. El trabajo de fondo procesará las notificaciones de estado de pago que se reciben de manera asincrónica desde Paypal. Dependiendo del estado, el trabajo realizará diferentes operaciones de base de datos. No es demasiado intenso, y actualmente lo proceso dentro de la aplicación. Pero parecía un mejor diseño simplemente registrar la información en una tabla en el momento de la recepción y hacer que el trabajador de segundo plano la procesara. – JimDaniel

Respuesta

7

¿Has probado con quartz.net? Creo que puede adaptarse a tus necesidades.

+0

Bien, solo para que entienda, si ejecuto un trabajo de cuarzo desde el archivo.asax global, ¿eso garantizaría que se ejecutara mientras el sitio web se ejecutara? Porque eso sería exactamente lo que necesito. – JimDaniel

+0

¡Sí! lo configuraste en la aplicación_start. – uvita

+0

desafortunadamente Godaddy aplica confianza media en IIS, esto restringe el uso de cuarzo – Luther

3

Para responder si GoDaddy admite un servicio por separado, debe solicitarlo.

Sin embargo, hay una serie de formas creativas que puede "solucionar" este problema en el alojamiento compartido.

  1. Tiene una página segura cuyo propósito es ejecutar su trabajo de fondo. Podría haber programado la tarea en una máquina bajo su control que llama a esta página web en intervalos establecidos.
  2. Utilice una variación de la respuesta del hilo del trabajador de fondo de @safi. El hilo de trabajo en segundo plano podría verificar si otro ya está procesando y detenerse, de modo que solo se ejecute una instancia a la vez.
+0

# 1 es lo que yo buscaría. Algunos proveedores de hosting como DiscountASP incluso le permiten especificar una URL que su servidor sondea en un intervalo predefinido, esencialmente para permitirle implementar # 1 –

+0

Una variante de # 1 sería un servicio REST seguro y ligero. Tal vez un método simple 'JsonResult', llamado por un cliente (que lo llama de vez en cuando). Básicamente la misma idea, hecha de una manera un poco más elegante. – rsenna

5

también eche un vistazo a este artículo Simulate a Windows Service using ASP.NET to run scheduled jobs.

explica una buena manera de programar operaciones sin dependencia externa.

La idea es utilizar el tiempo de espera de caché para controlar el programa. Lo he implementado con éxito en un proyecto que requirió la limpieza regular de archivos temporales. Esta limpieza es un poco pesada, por lo que movemos esta operación limpia en un trabajo programado (utilizando la caché asp.net) para evitar tener que implementar tareas programadas o programas personalizados.

+0

Excelente técnica! Parece que esto fue realmente usado en StackOverflow.com. Ver: http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/. – Jonathan

1

Si solo una tarea en segundo plano es suficiente para usted, utilice WebBackgrounder y esta es la article con una explicación detallada.

Cuestiones relacionadas