2010-04-05 15 views
18

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

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 instalará en nuestro servidor y realizará 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. 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 ningún problema en el servicio ni en su instalador. El único problema es cómo probar mi servicio de Windows.

Respuesta

12

Puede conectar la solución de Visual Studio a la aplicación de servicio de Windows. Luego puede depurar el servicio de Windows como lo hace un proyecto normal.

Depurar -> Adjuntar al proceso.

20

Siempre puede crear una aplicación/consola de aplicaciones híbrida, y usar la aplicación de la consola para realizar pruebas.

Lo que hay que hacer es algo como esto - en su program.cs, cambiar el método de Main a cualquiera ejecutar el servicio, u opcionalmente ejecutar 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 hereda de ServiceBase y tiene la OnStart y OnStop, añadir 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 bien, si desea ejecutar la aplicación para probar su funcio nality, 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.

+3

+1 Esta debe ser la respuesta aceptada ya que esto también detecta los problemas antes de que pueda tener la oportunidad de adjuntar al proceso. – Joe

+1

OnStop() es inalcanzable, por cierto. –

+1

¿Por qué Console.ReadLine() ha comentado? ¿No es eso correcto? Deshazte del bucle infinito ... – Phil

2

Hay un par de maneras:

1) Crear una aplicación de Windows estándar que exige el mismo código, esto es más fácil de ejecutar y depurar. Esto también garantiza que su código de servicio no se encuentre todo dentro del servicio, sino que se refactorice a su propio ensamblaje.

2) En su archivo de programa del 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 puede ejecutar desde Visual Studio. (Necesitará hacer que sus métodos de servicio, etc., sean públicos y crear una postura de su servicio)

3

¡Use un registrador para informar errores!

Intente atrapar todos los errores posibles e inicie sesión en un archivo y/o envíe un correo electrónico mejor: recuerde "¡nadie oye la muerte de un servicio"!

Log4Net tiene logger para manejar archivos continuados, persistencia dabatase e incluso mensajes SMTP. Por ejemplo, consulte: http://logging.apache.org/log4net/release/config-examples.html Probablemente tenga que verificar el archivo de registro para detectar errores con bastante regularidad. Para evitar este tipo de tarea, a menudo uso el appender SMTP.

Cheers, B.

2

creo que cada uno tiene proporcionar una gran cantidad de grandes respuestas. Este sería mi enfoque ordenado para la depuración de este problema:

  • Compruebe su registro de eventos.
  • Registra todos los errores (Log4Net, Enterprise Library, o simplemente escribe en el registro de eventos), especialmente haz una try..catch en tu método principal.
  • Escriba una unidad de las pruebas que puede ejecutar en el entorno.
  • Asegúrese de que su archivo app.config sea el correcto. Es posible que necesite combinar valores de diferentes proyectos en uno solo.
  • Prueba de conectividad con la base de datos. Haga ping al servidor. Telnet al puerto 1433 (si es SQL Server predeterminado). Escribe una aplicación de consola simple para probar.
  • Depure al adjuntarlo al proceso.
  • Utilice el enfoque híbrido consola/servicio (gran técnica y uso para transmitir mensajes de depuración en tiempo real).
3

La respuesta de marc_s es perfecta, pero por el hecho de que el hilo principal del servicio no se para en espera de la entrada del usuario como estaba previsto. Creo que esta es la razón por la que él puso en un ciclo infinito.

préstamos de Igal Serban's código para crear una consola, aquí es una mejora del método RunConsole() que no hacer 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(); 
    } 
+0

Gracias, este ** es ** perfecto! :-) –

Cuestiones relacionadas