2010-07-27 19 views
11

Ho due servizi Windows scritti in C# seguendo gli stessi schemi e la stessa metodologia.Strano problema con un servizio Windows .NET

Entrambi i servizi sono stati testati per lo sviluppo rispetto a un VM Windows 7 e al QA testati su Windows Server 2008 VM. Entrambi i servizi sono stati installati e disinstallati molte volte in questi ambienti di test senza problemi, tuttavia durante l'installazione nell'ambiente di produzione (Windows Server 2008) uno dei due servizi si rifiuta di avviarsi.

Per installare i servizi si utilizza InstallUtil.exe con i componenti ServiceInstaller e ServiceProcessInstaller collegati al servizio.

In tutte le apparenze, il servizio in errore viene installato correttamente. InstallUtil.exe segnala il successo e il servizio viene visualizzato nello snap-in Servizi. È inoltre possibile individuare il servizio nel registro in HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Blah Blah. Tuttavia, se si tenta di avviare il servizio si ottiene quanto segue:

net start blah.blah.exe "Il nome del servizio non è valido."

... o passare attraverso lo snap-in Servizi ... "Impossibile avviare il servizio 'Blah Blah' sul computer locale Errore 1053:. Il servizio non ha risposto alla richiesta di avvio o controllo in modo tempestivo ".

Ho aggiunto qualche registrazione degli eventi al costruttore del servizio in errore della classe di servizio, ma non sembra essere richiamato.

Poiché questa è una casella di produzione, non è presente Visual Studio sulla scatola e il debug remoto è fuori questione.

C'è qualche altro modo per ottenere informazioni di debug sul motivo per cui il servizio in errore non viene avviato?

C'è qualche altra ovvia ragione per cui potrei vedere questo tipo di problema?

Edit: avrei anche detto .. L'unica altra evidenza di un problema nel Visualizzatore eventi di Windows è di due messaggi nel Registro di sistema dal Service Control Manager:

"è stato raggiunto un timeout (30000 millisecondi) in attesa che il Blah Blah servizio per connettersi

"la Blah Blah di servizio non è stato avviato per il seguente errore: il servizio non ha risposto alla richiesta di avvio o controllo in modo tempestivo.".

Modifica: risolto Il problema si è rivelato una combinazione di un errore di configurazione e un bug che lo nascondeva. Vedere il mio answer sotto per maggiori dettagli.

+1

La versione corretta di .NET è installata nel sistema di produzione? –

+1

@Matt Sì, questo .NET 3.5 e si trova sulla scatola di produzione. –

+1

Solo uno scatto al buio: controlla il metodo Main, per impostazione predefinita nel file Program.cs. Hai detto che hai aggiunto la registrazione al costruttore della classe di servizio, ma non sembra essere stato chiamato. Aggiungerei la registrazione all'inizio del metodo Main per verificare se anche quello viene chiamato. Forse è stato aggiunto un codice di inizializzazione e non sta funzionando correttamente nell'ambiente di produzione. –

risposta

7

Jeopardy Answer: "In che modo la configurazione personalizzata non valida combinata con un gestore di eccezioni globali non valido si può manifestare in un servizio .NET di Windows?"

Capito.

La causa principale del problema era una sezione di configurazione personalizzata non valida in app.config. Utilizziamo una sezione di configurazione personalizzata per configurare il servizio da app.config e l'assembly e lo spazio dei nomi della classe derivata ConfigurationSection sono stati modificati di recente.

Come risulta, la nostra configurazione di produzione stava cercando la definizione della configurazione personalizzata nell'assembly sbagliato e l'eccezione generata quando non si riusciva a creare un'istanza era nascosta da un bug in cui le eccezioni venivano rilevate all'inizio della vita del servizio tenterebbe di essere registrato nel log personalizzato anziché nel registro eventi dell'applicazione. (Dal momento che la fonte del log degli eventi non esisteva nel log degli eventi personalizzati, questa avrebbe gettato un'altra eccezione dal gestore globale delle eccezioni e il servizio sarebbe morto nel costruttore.)

Questa seconda eccezione non è stata registrata da nessuna parte e abbiamo solo trovato attraverso l'ispezione del codice.

La risoluzione era di correggere la configurazione e di modificare il gestore di eccezioni globale per tentare solo di scrivere nel registro eventi dell'applicazione utilizzando il nome del servizio come origine del registro eventi. (InstallUtil registra il nome del servizio come origine del registro eventi nel registro dell'applicazione.)

Grazie per l'aiuto di tutti! Spiacenti, questo particolare problema si è rivelato così specifico per la nostra configurazione.

+0

Immagino di avere lo stesso problema qui. Lo controllerò. Grazie – apacay

0

Questo è un problema comune. Che codice hai nel tuo evento Start?

È necessario disporre solo del codice che attiva un timer all'avvio del servizio. Ciò consente di completare rapidamente l'evento Start e informare il controller. Se l'esecuzione richiede più tempo, otterrai l'errore che hai ricevuto. Potrebbero esserci alcune ragioni (probabilmente legate ai dati) per cui è necessario un tempo maggiore di produzione.

Quando il timer fa tic tac, eseguire il codice e interrompere il timer. Ovviamente, metti anche tutto in try/catch e registra le eccezioni.

+0

Grazie per il rispondi, ma questo problema è un po 'più complesso di quello. L'esecuzione sta effettivamente morendo nel costruttore per il servizio. Vedi la mia ultima coppia di commenti sull'OP. –

+0

Puoi provare se! SourceExists (mySourceName)? Mettendo tutto dopo InitializeComponent in un try/catch? Non vedo perché altrimenti non dovrebbe iniziare. – Zesty

1

cosa stai provando a fare all'avvio del servizio?

Controllare anche l'account tramite il quale il servizio è in esecuzione e l'account dispone dei privilegi necessari.

2

Potrebbe essere possibile dal messaggio di errore che hai descritto

net start blah.blah.exe "The service name is invalid."

Che il nome assegnato al servizio al servizio di installazione componente che si è aggiunto in Visual Studio non è quello che pensi è.

Ho avuto questo problema diverse volte con gli sviluppatori che mischiano i servizi nelle installazioni.

1

ho incontrato problemi come questo molte volte durante la programmazione i miei servizi, quindi mi limiterò a elencare fuori un mucchio di cose che in vari punti risolti i miei problemi e spero che ti aiutano:

  1. Ho dovuto riavviare services.msc perché ho disinstallato un servizio che ancora pensavo avesse un riferimento. Tuttavia, quando lo avvii, il "servizio non era valido"

  2. Se si sta effettuando il servizio da un'applicazione console (in modo che possa essere eseguito il debug) ma si dimentichi di cambiarlo in un servizio, ha vinto iniziare.

  3. Quando stavo usando InstallUtil.exe, a volte avrebbe tentato di installare più copie, quindi sono passato a utilizzare semplicemente un progetto di installazione.

La speranza che aiuta in qualche modo.

0

È possibile che questo errore si verifica quando

  • il servizio è in funzione un altro servizio/applicazione
  • oa causa di configurazioni App.config validi

incontrato lo stesso problema quando Entity Framework non è stato in grado di connettersi al server del database a causa della mancanza di autorizzazione. Meglio aggiungere un meccanismo di registrazione degli errori a livello globale all'applicazione per risolvere facilmente il problema. Il Visualizzatore eventi potrebbe non rivelare i dettagli esatti in alcuni scenari.

Problemi correlati