2010-04-05 12 views
18

Desidero creare un servizio Windows che acceda al mio database. Il mio database è SQL Server 2005.Problema con il test di un servizio Windows

Attualmente sto lavorando su un sito Web e il mio database è all'interno del nostro server. Ho bisogno di accedere al mio database ogni secondo e aggiornare i record. A tale scopo ho bisogno di creare un servizio di Windows che verrà installato nel nostro server ed eseguire l'operazione.

Ho avuto accesso al database dal mio computer locale e quindi ho eseguito il servizio, ma il problema è che non sono sicuro di come posso testare questo servizio.

Ho provato a installare nel mio computer locale. Ha installato e quindi ho eseguito il servizio ma non ha eseguito l'attività e ritengo che il servizio non sia in grado di connettersi con il database.

Non c'è alcun problema nel servizio né nel suo programma di installazione. L'unico problema è come testare il mio servizio di Windows.

risposta

12

È possibile allegare la soluzione di Visual Studio all'applicazione di servizio Windows. Quindi è possibile eseguire il debug del servizio Windows mentre si esegue un normale progetto.

Debug -> Collega al processo.

20

È sempre possibile creare un ibrido per app di servizio/console e utilizzare l'app della console per scopi di test.

Quello che dovete fare è qualcosa di simile - nel vostro program.cs, cambiare il metodo di Main a uno eseguire il servizio, o, in alternativa eseguito come un'applicazione console:

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); 
     } 
    } 

e quindi sulla vostra classe di servizio, che eredita da ServiceBase e ha la OnStart e OnStop, aggiungere il metodo RunConsole in questo modo:

public void RunConsole(string[] args) 
    { 
     OnStart(args); 

     Console.WriteLine("Service running ... press <ENTER> to stop"); 

     //Console.ReadLine(); 
     while (true) 
     { } 

     OnStop(); 
    } 

Ora, se si desidera eseguire l'applicazione per testare la sua funzio nality, basta lanciare l'EXE con un parametro di riga di comando -console e inserire un punto di interruzione nel metodo RunConsole.

+3

+1 Questa dovrebbe essere la risposta accettata dal momento che questo cattura anche i problemi prima di poter avere la possibilità di allegare al processo. – Joe

+1

OnStop() è irraggiungibile, a proposito. –

+1

Perché Console.ReadLine() ha commentato? Non è corretto? Sbarazzarsi del ciclo infinito ... – Phil

2

ci sono un paio di modi:

1) Creare un Windows app standard che chiama lo stesso codice, questo è più facile da eseguire e il debug. Ciò garantisce anche che il codice di servizio non sia interamente incluso nel servizio, ma che sia refactored al proprio assembly.

2) Nel file Programma server, rilevare se il servizio viene eseguito in modo interativo e chiamare i metodi di servizio all'interno del servizio per eseguire una volta. In questo modo puoi anche solo eseguire da Visual Studio. (devi rendere pubblici i tuoi metodi di servizio, ecc., e creare un punto di vista del tuo servizio)

3

Utilizzare un programma di registrazione per segnalare errori!

Prova ad individuare tutti gli errori possibili e registrali in un file e/o inviare una e-mail: ricorda "nessuno sente morire un servizio"!

Log4Net dispone di un programma di registrazione per gestire i file in rotazione, la persistenza dabatase e persino il messaggio SMTP. Ad esempio, vedi: http://logging.apache.org/log4net/release/config-examples.html Probabilmente dovrai controllare gli errori del file di log abbastanza regolarmente. Per evitare questo tipo di lavoro, utilizzo spesso l'appender SMTP.

Cheers, B.

2

Penso che ognuno di noi ha di fornire un sacco di grandi risposte. Questo sarebbe il mio approccio ordinato per il debug di questo problema:

  • Controllare il registro degli eventi.
  • Registrare tutti gli errori (Log4Net, Enterprise Library, o semplicemente scrivere nel registro eventi), in particolare fare un try..catch nel metodo Main.
  • Scrivi un test di unità che è possibile eseguire nell'ambiente.
  • Verificare che il file app.config sia corretto. Potrebbe essere necessario unire i valori di diversi progetti in uno solo.
  • Connettività del database di test. Effettua il ping del server. Telnet alla porta 1433 (se SQL Server predefinito). Scrivi una semplice app per console da testare.
  • Eseguire il debug collegandosi al processo.
  • Utilizzare l'approccio ibrido console/servizi (tecnica eccezionale e utilizzo per lo streaming di messaggi di debug in tempo reale).
3

La risposta di marc_s è perfetta, ma per il fatto che il thread principale del servizio non viene messo in pausa in attesa dell'input dell'utente come previsto. Penso che questo sia il motivo per cui ha inserito un ciclo infinito.

Prendendo in prestito da Igal Serban's codice per la creazione di una console, ecco un miglioramento del metodo RunConsole() che non mettere in 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

Grazie, questo ** è ** perfetto! :-) –

Problemi correlati