2012-05-21 10 views
6

Sono abbastanza nuovo per i servizi di Windows. Ho creato un programma di installazione per il mio servizio Windows C# e l'installazione sul server (Windows Server 2003) sembra aver funzionato. Quando viene avviato, scrive Service started successfully nel registro. Quando viene fermato, scrive Service stopped successfully. Tuttavia, a volte il servizio si arresta senza scrivere nulla nel log, quindi lo riavvio manualmente. Quando guardo il registro in seguito, dice Service started successfully come previsto. È strano vedere che nel registro due volte di fila è evidente che manca una voce in cui il servizio ha in qualche modo smesso di funzionare.Perché il mio C# servizio Windows smette di funzionare senza che nessun messaggio venga scritto nel registro eventi dell'applicazione?

Quali potrebbero essere le potenziali cause di questo? Ho il servizio configurato come automatico e l'ho installato per funzionare per tutti gli utenti. Ho avuto l'impressione che ciò significhi che il servizio si avvia automaticamente ogni volta che si avvia la macchina. Come posso scoprire perché si è fermato? I servizi che si arrestano in modo anomalo si scrivono automaticamente nel registro eventi o devo gestire le eccezioni in modo tale che registrino il proprio motivo per l'arresto anomalo?

Edit: Alcune informazioni aggiuntive:

  • l'ho impostato per accedere come account di sistema locale
  • Sotto Opzioni di ripristino, l'ho impostato per riavviare il primo fallimento. Non ho nulla per il secondo o successivi fallimenti.

Aggiornamento: Un rispondente ha consigliato un gestore di eccezioni globale. Anche se non lo implementerò come una correzione permanente, mi aiuterà almeno a capire dove si sta verificando il problema. Ho effettivamente provato questo con il mio servizio installato e funziona. Ho scoperto che le eccezioni non gestite effettivamente causano il crash del servizio senza scrivere nulla sul log. Ho pensato che avrebbe almeno riportato qualche errore dell'applicazione, ma non è così.

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

Hai controllato il registro eventi? – pms1969

risposta

4

È sempre meglio gestire le eccezioni. Almeno utilizzare un gestore di eccezioni globale e scriverlo in un file di registro

+0

Sono andato su questa strada e sembra funzionare (ha aggiornato la mia domanda con il codice). A proposito, gestisco le eccezioni, ma non ho try/catch blocchi ovunque. L'implementazione del gestore globale funziona alla grande e mi consentirà di capire dove si verificano i problemi. Grazie! – oscilatingcretin

3

Sembra che il servizio non funzioni in modo imprevisto senza eseguire alcuna gestione delle eccezioni e/o registrazione. I servizi di Windows non scrivono automaticamente eccezioni al registro eventi: tocca a te gestire le eccezioni e (se sono fatali) scriverle da qualche parte in modo da poter diagnosticare il problema.

Per lo meno, consiglierei un file di registro da qualche parte (forse nella cartella del servizio eseguibile, o preferibilmente da qualche altra parte che è facile da raggiungere e non verrà eseguito in contrasto con i problemi di autorizzazione) e un metodo di registrazione standard che tutti i tuoi gestori di eccezioni chiamano per scrivere i loro messaggi a.

0

Se un servizio si interrompe inaspettatamente a causa di qualche eccezione, non sono sicuro che verrebbe automaticamente inserito nel registro eventi.

Consiglio vivamente una suite di registrazione come log4net per una registrazione più approfondita. Sarai in grado di fornire una moltitudine di "livelli" di registrazione (tracce di debug per vedere se hai raggiunto qualche codice, tracce di informazioni per eventi importanti, tracce di errore per registrare eccezioni).

È possibile cercare here per un esempio di EventLogAppender. Tuttavia, suggerirei di iniziare a procurarsi un FileAppender, uno dei log più facili da creare, lavorare prima e poi aggiungere un secondo appender per il registro eventi.

Problemi correlati