2010-03-24 19 views
8

He escrito un servicio web C#. El problema es que después de publicarlo en IIS, no se iniciará automáticamente a menos que se invoque cualquiera de sus métodos. Esto es muy frustrante porque este servicio web tiene que hacer un trabajo de fondo de forma continua inmediatamente después de que se inicia (su constructor se ejecuta). Si se reinicia IIS, el WebService se quedará inactivo hasta que se invoque uno de sus métodos. ¿Hay alguna manera de superar esto y obligar al WebService a ejecutar su constructor inmediatamente después de que se publique o reinicie IIS?¿Cómo iniciar automáticamente un servicio web C#?

+2

¿Por qué esta pregunta es hecha por Hancock, pero a todas las respuestas responde TomTom? Muy confuso a primera vista. – PetPaulsen

+0

Me sorprende la cantidad de respuestas y el gran interés que despierta este tema. :) – hancock

Respuesta

10

Si tiene que hacer un trabajo de fondo de forma continua inmediatamente después de que se inicia, ¿por qué no implementar esto en un servicio de Windows ? Creo que puede escribir un servicio WCF que se alojará en el servicio de Windows. De esta forma, los clientes pueden llamar a su servicio, el servicio puede hacer su trabajo de fondo y no dependerá de IIS ya que el servicio de ventana de host se ejecutará en su propio proceso.

+0

-1 - off no ver escenarios del mundo real que requieren esto. – TomTom

+0

Tom, ¿por qué no se hará en un mundo real? :-) La belleza de WCF es que puedo alojar un servicio en cualquier tipo de host y uno puede aprovechar el servicio de Windows en este escenario. Por qué no?Por favor explique. –

+0

Mundo real, 1: el servicio WCF puede ser parte de un sitio web. 2: puede estar expuesto en un host compartido, es decir, no es posible la instalación. 3: puede que simplemente necesite un inicio y no quiero establecer conexiones y compilar en la primera solicitud. Como dije, el equipo de IIS está de acuerdo. – TomTom

4

Si necesita que se ejecute todo el tiempo, su diseño es defectuoso. Crea un servicio de Windows en su lugar.

+0

-1 - no ver los escenarios del mundo real que requieren esto. – TomTom

+4

Au contraire, TomTom, este es exactamente el escenario del "mundo real" para el que se diseñaron los servicios de Windows. Como dice Axyradax, un servicio web no está destinado a hacer un trabajo de fondo de forma continua, está ahí para atender las solicitudes. Un servicio de Windows está ahí para hacer un trabajo en segundo plano de forma continua y/o atender solicitudes. El hecho de que el "servicio web" tenga la palabra "servicio" no significa que pueda o deba estar haciendo el trabajo de un servicio de Windows. – itowlson

+0

Mundo real, 1: el servicio WCF puede ser parte de un sitio web. 2: puede estar expuesto en un host compartido, es decir, no es posible la instalación. 3: puede que simplemente necesite un inicio y no quiero establecer conexiones y compilar en la primera solicitud. Como dije, el equipo de IIS está de acuerdo. – TomTom

3

No creo que un servicio web esté destinado a hacer un trabajo en segundo plano de forma continua: está ahí para atender las solicitudes de sus métodos.

+0

Esto ignora el hecho de que aún puede ser bueno mantener el servidor en funcionamiento. Tengo una interfaz para un sistema en el que el inicio de sesión toma entre 15 y 20 segundos. No quiero iniciar sesión en el momento en que un usuario solicita algo: quiero que el sistema se caliente y se mantenga caliente. – TomTom

+0

¿Puedes elaborar sobre eso? Solo estoy ponderando las opciones aquí ... ¿por qué los servicios web no deberían funcionar en segundo plano? – hancock

+1

El servicio web está destinado a ser una interfaz API para algo que se ejecuta en un equipo servidor, por ejemplo, una base de datos. Como es solo la interfaz, no es algo que hace el trabajo real. Por ejemplo, si tuviese un robot doméstico, su servicio web simplemente leería su estado y agregaría comandos a su base de datos (sí, haría un robot con una base de datos) y el sistema de control del robot interpretaría estos comandos y haría el Trabajo actual. – Axarydax

1

Necesita crear el servicio de Windows. Here son los pasos para crear el servicio de Windows para la tarea programada.

1

Además de la observación (correcta) de que debe usar un servicio de Windows para las cosas que deben ejecutarse en segundo plano: ¿Puede utilizar el evento Application_Start en el archivo global.asax?

+3

AFAIK, ese evento solo ocurriría cuando el servicio web reciba su primera solicitud. –

+0

Sí. No inicia la aplicación. – TomTom

+0

El servicio web no tiene actualmente un archivo Global.asax. ¿Puedo iniciarlo automáticamente desde allí si lo agrego? – hancock

1

Estoy de acuerdo con los demás, debe usar un servicio de Windows. Si está utilizando WCF, puede alojar fácilmente su servicio web dentro de un servicio de Windows y obtener lo mejor de ambos mundos. Vea esto msdn article para un tutorial.

+0

Ver alojamiento compartido para el mundo real. Puede no ser posible, ocasiona posiblemente una gran sobrecarga administrativa. Hay buenas razones para NO autohospedarse. – TomTom

-1

Y no estoy de acuerdo. Hay buenas razones para asegurarse de que se inicia un servicio web con la computadora, para permitir que comience a llenar sus cachés y/o para evitar la lenta primera ejecución.

El equipo de IIS está conmigo en eso. Es por eso que soemthing desarrolladas para ello:

http://www.iis.net/expand/ApplicationWarmUp

Este módulo puede asegurarse de que un sitio web es "caliente" (como en: iniciado) cuando se inicia IIS.

+6

El calentamiento de la aplicación es sin duda una buena idea para las aplicaciones de caché (y servicios web), pero la pregunta era sobre el "trabajo en segundo plano continuo". IMO, basándose en el trabajo de fondo que se está ejecutando debido al calentamiento de la aplicación, es un truco. –

+0

Depende MUCHO en lo que está haciendo este trabajo de fondo. Podría ser "limpiar la carpeta temporal cada 30 segundos". Podría ser "elegir nuevos datos de mercado para exponer cada 15 segundos": todos los antecedentes continuos válidos funcionan incluso en una aplicación web. – TomTom

+0

Se calentará solo en la primera solicitud ... luego se apagará tu aplicación después de un tiempo sin solicitudes, luego comenzará de nuevo (con otro calentamiento). – leppie

1

En realidad, puede ejecutar un subproceso o un trabajo automáticamente en "Global.asax.cs". P.ej.

public System.Threading.Thread schedulerThread = null; 
protected void Application_Start(Object sender, EventArgs e) 
    { 
    schedulerThread = new System.Threading.Thread(YourLoopBackgroudMethodHere); 
    schedulerThread.Start(); 
    } 
Y no olvide cerrar el hilo cuando termine la aplicación de su sitio.

protected void Application_End(Object sender, EventArgs e) 
    { 
    if (null != schedulerThread) 
    { 
     schedulerThread.Abort(); 
    } 
    }
+0

¡El hilo o la tarea se ejecutará automáticamente una vez que el programa de su sitio web se esté ejecutando! – jujusharp

+0

El servicio web no tiene actualmente un archivo Global.asax. ¿Puedo iniciarlo automáticamente desde allí si lo agrego? – hancock

+0

Lo siento, no inicié sesión en este sitio hace días, sí, puede crear un archivo Global.asax en su proyecto y agregar su código en la función de Inicio. Espero que hayas resuelto el problema ya! – jujusharp

Cuestiones relacionadas