2008-10-01 10 views
16

Estoy escribiendo una serie de servicios de Windows. Quiero que fallen si se producen errores durante el inicio (en el método OnStart()). Había asumido que simplemente arrojando un error en OnStart() haría esto, pero estoy descubriendo que en su lugar se "Inicia" y me presenta un mensaje que dice "El servicio ha comenzado, pero está inactivo. ¿Es esto correcto?" (Paráfrasis). ¿Cómo manejo el error por lo que realmente no puede iniciar el servicio?excepción de control en el inicio del servicio

Respuesta

8

si está ejecutando .NET 2.0 o superior, puede usar ServiceBase.Stop para detener el servicio de OnStart. De lo contrario, llame a Stop desde un nuevo hilo.

ref [devnewsgroups] ( http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx)

(grupo de noticias ido)

+0

el dominio de referencia se ha ido – hultqvist

+0

Internet Archive al rescate: https://web.archive.org/web/20070730021813/http://www.devnewsgroups.net/group/microsoft.public.dotnet. framework/topic50404.aspx –

7

Mueva toda su lógica de inicio a un método diferente y genere excepciones (o llame a OnStop) desde ese método independiente.

OnStart tiene algunas rarezas al arrancar. Descubrí que si OnStart() no tiene más de una línea, no aparece el mensaje "El servicio se inició y luego se detuvo. Algunos servicios se detienen automáticamente si no tienen trabajo pendiente", y las excepciones arrojadas terminarán. procesar y registrarse en el registro de eventos de la aplicación.

También con el método de inicio independiente, puede utilizar una técnica como esta para depurarla sin adjuntarla. http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx

16

Si lo principal que queremos es que la ventana Servicios de informar que hubo un error, por lo que' he intentado (.net 3.5 en Windows 7), la única forma de hacerlo es estableciendo el código de salida. Recomiendo configurarlo en 13816, ya que esto da como resultado el mensaje "Se ha producido un error desconocido". Ver the windows error codes.

El ejemplo siguiente logra tres cosas. 1 - la configuración de ExitCode da como resultado un mensaje útil para el usuario final. No afecta el registro de la aplicación de Windows, pero sí incluye un mensaje en el registro del sistema. 2 - Calling Stop da como resultado un mensaje "Service successfully stopped" en el registro de la aplicación. 3 - lanzar los resultados de la excepción en una entrada de registro útil en el registro de la aplicación.

protected override void OnStart(string[] args) { 

    try { 
    // Start your service 
    } 
    catch (Exception ex) { 
    // Log exception 
    this.ExitCode = 13816; 
    this.Stop(); 
    throw; 
    } 

} 
+1

13816 está etiquetado como un error IPSEC por lo que no se aplica exactamente, pero cualquier int no distinto de cero se considera un error por el Administrador de control de servicios. Creo que el significado del código depende del servicio en sí. – xr280xr

+2

Ese es un muy buen punto. Tal vez, el código 1064 sería mejor. (ERROR_EXCEPTION_IN_SERVICE - Se produjo una excepción en el servicio cuando se maneja la solicitud de control). La idea principal para mí es mostrarle al usuario un mensaje que es de alguna utilidad, y especialmente no engañoso. – Sean

+1

Las partes clave están configurando el código de salida y el lanzamiento. No es necesario el 'Stop();' - el manejador de excepciones en ServiceBase hace esto. –

Cuestiones relacionadas