2012-05-21 21 views
6

Soy bastante nuevo en los servicios de Windows. Creé un instalador para mi servicio C# Windows y la instalación en el servidor (Windows Server 2003) parece haber funcionado. Cuando se inicia, escribe Service started successfully en el registro. Cuando se detiene, escribe Service stopped successfully. Sin embargo, a veces el servicio deja de ejecutarse sin escribir nada en el registro, por lo que lo inicio de nuevo manualmente. Cuando miro el registro después, dice Service started successfully como se esperaba. Es extraño ver en el registro dos veces seguidas que obviamente falta una entrada donde el servicio de alguna manera ha dejado de ejecutarse.¿Por qué mi servicio de Windows C# deja de ejecutarse sin que se escriban mensajes en el registro de eventos de la aplicación?

¿Cuáles podrían ser las posibles causas de esto? Tengo el servicio configurado como automático y lo instalé para que se ejecute para todos los usuarios. Tenía la impresión de que esto significa que el servicio se inicia automáticamente cada vez que la máquina arranca. ¿Cómo puedo averiguar por qué se detuvo? ¿Los servicios que bloquean se escriben automáticamente en el registro de eventos o tengo que manejar las excepciones de tal manera que registran su propio motivo del bloqueo?

Editar: Alguna información adicional:

  • lo tengo configurado para iniciar sesión como cuenta del sistema local
  • Bajo Opciones de recuperación, lo tengo configurado para reiniciar el primer fracaso. No tengo nada para fracasos secundarios o subsiguientes.

Actualización: Un contestador recomendó un controlador de excepción global. Si bien no implementaré esto como una solución permanente, al menos me ayudará a descubrir dónde está ocurriendo el problema. De hecho, probé esto con mi servicio instalado y funciona. Descubrí que las excepciones no controladas realmente bloquean el servicio sin escribir nada en el registro. Pensé que al menos reportaría algún error de aplicación, pero no es así.

static void Main() 
{ 
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

    //other code here 
} 

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    Utilities.WriteIt(e.ExceptionObject as Exception); 
} 
+0

¿Has comprobado el EventLog? – pms1969

Respuesta

4

Siempre es mejor manejar las excepciones. Al menos use un manejador de excepción global y escríbalo en un archivo de registro

+0

Fui por esta ruta y parece estar funcionando (actualicé mi pregunta con el código). Por cierto, sí manejo excepciones, pero no tengo try/catch blocks everywhere. La implementación del controlador global funciona muy bien y me permitirá saber dónde están ocurriendo los problemas. ¡Gracias! – oscilatingcretin

3

Parece que su servicio está fallando inesperadamente sin hacer ningún tipo de manejo de excepción y/o registro. Los servicios de Windows no escriben excepciones de forma automática en el Registro de eventos; depende de usted manejar excepciones y (si son fatales) escríbalas en algún lugar para que pueda diagnosticar el problema.

Por lo menos, recomendaría un archivo de registro en algún lugar (quizás en la carpeta ejecutable del servicio, o preferiblemente en otro lugar que sea fácil de acceder y no tenga problemas de permisos) y un método de registro estándar que todos sus manejadores de excepciones llaman para escribir sus mensajes a.

0

Si un servicio se cierra inesperadamente debido a alguna excepción, no estoy seguro de que termine automáticamente en el registro de eventos.

Recomiendo encarecidamente un conjunto de registro como log4net para un registro más completo. Podrá proporcionar una multitud de 'niveles' de registro (rastreos de depuración para ver si llegó algún código, rastreos de información para eventos importantes, rastreos de error para registrar excepciones).

Puede buscar here para ver un ejemplo de EventLogAppender. Sin embargo, sugiero comenzar con un FileAppender, uno de los registros más fáciles de crear, trabajando primero y luego agregue un segundo appender para el registro de eventos.

Cuestiones relacionadas