visual studio servicio services instalar example debuggear debug c# windows sql-server-2005 windows-services

studio - windows service debug onstart c#



Problema con probar un servicio de Windows (6)

Creo que todos han proporcionado muchas respuestas geniales. Este sería mi enfoque ordenado para depurar este problema:

  • Revise su registro de eventos.
  • Registre todos los errores (Log4Net, Enterprise Library o simplemente escriba en el registro de eventos), especialmente pruebe ... vea su método principal.
  • Escribe una unidad de pruebas que puedas ejecutar en el entorno.
  • Asegúrese de que su archivo app.config sea correcto. Es posible que necesite fusionar valores de diferentes proyectos en uno.
  • Probar la conectividad de la base de datos. Ping al servidor. Telnet al puerto 1433 (si es el servidor SQL predeterminado). Escribe una aplicación de consola simple para probar.
  • Depurar adjuntando al proceso.
  • Utilice el enfoque híbrido de consola / servicio (excelente técnica y uso para transmitir mensajes de depuración en tiempo real).

Quiero hacer un servicio de Windows que acceda a mi base de datos. Mi base de datos es SQL Server 2005.

Actualmente estoy trabajando en un sitio web y mi base de datos está dentro de nuestro servidor. Necesito acceder a mi base de datos cada segundo y actualizar los registros. Para ello, necesito hacer un servicio de Windows que se instale en nuestro servidor y realice la tarea.

He estado accediendo a la base de datos desde mi máquina local y luego ejecutando el servicio, pero el problema es que no estoy seguro de cómo puedo probar este servicio.

Intenté instalar en mi máquina local. Se instaló y luego ejecuté el servicio, pero no realizó la tarea y creo que el servicio no puede conectarse con la base de datos.

No hay problema en el servicio ni en su instalador. El único problema es cómo probar mi servicio de Windows.


Hay un par de maneras:

1) Cree una aplicación estándar de Windows que llame al mismo código, esto es más fácil de ejecutar y depurar. Esto también garantiza que su código de servicio no esté todo dentro del servicio, pero que se haya refaccionado a su propio ensamblaje.

2) En su archivo de Programa de Servidor, detecte si el servicio se ejecuta de forma interactiva y llame a los métodos de servicio dentro del servicio para que se ejecuten una vez. De esta manera también puedes ejecutar desde Visual Studio. (deberá hacer públicos sus métodos de servicio, etc. y crear una postura de su servicio)


La respuesta de marc_s es perfecta, pero por el hecho de que el hilo principal del servicio no se detiene en espera de la entrada del usuario como se esperaba. Creo que es por eso que puso un bucle infinito.

Tomando prestado el código de Igal Serban para crear una consola, aquí hay una mejora del método RunConsole() que hace una pausa:

[DllImport("kernel32.dll", SetLastError = true)] static extern bool AllocConsole(); [DllImport("kernel32.dll", SetLastError = true)] static extern bool FreeConsole(); public void RunConsole(string[] args) { OnStart(args); AllocConsole(); Console.WriteLine("Service running ... press <ENTER> to stop"); Console.ReadLine(); FreeConsole(); OnStop(); }


Puede adjuntar la solución de estudio visual a la aplicación de servicio de Windows. Luego puedes depurar el servicio de Windows mientras haces un proyecto normal.

Depurar -> Adjuntar al proceso.


Siempre puede crear una aplicación de servicio / consola híbrida y usar la aplicación de consola para propósitos de prueba.

Lo que debe hacer es algo como esto: en su program.cs , cambie el método Main para ejecutar el servicio u, opcionalmente, ejecute como una aplicación de consola:

static class Program { static void Main(params string[] args) { string firstArgument = string.Empty; if (args.Length > 0) { firstArgument = args[0].ToLowerInvariant(); } if (string.Compare(firstArgument, "-console", true) == 0) { new YourServiceClass().RunConsole(args); } else { ServiceBase[] ServicesToRun = new ServiceBase[] { new YourServiceClass() }; ServiceBase.Run(ServicesToRun); } }

y luego en su clase de servicio, que se hereda de ServiceBase y tiene OnStart y OnStop , agregue el método RunConsole así:

public void RunConsole(string[] args) { OnStart(args); Console.WriteLine("Service running ... press <ENTER> to stop"); //Console.ReadLine(); while (true) { } OnStop(); }

Ahora, si desea ejecutar la aplicación para probar su funcionalidad, simplemente inicie el EXE con un parámetro de línea de comando -console y coloque un punto de interrupción en el método RunConsole .


Utilice un registrador para reportar errores!

Intente detectar todos los errores posibles e inicie sesión en un archivo o, mejor, envíe un correo electrónico: recuerde que "nadie escucha un servicio que está muriendo".

Log4Net tiene un registrador para manejar archivos rodantes, persistencia de datos y hasta mensajes SMTP. Por ejemplo, consulte: http://logging.apache.org/log4net/release/config-examples.html Es probable que tenga que revisar el archivo de registro para detectar errores con bastante frecuencia. Para evitar este tipo de tarea, a menudo utilizo el appender SMTP.

Saludos, B.