Windows Service - ExceptionHandling bei Fehler in OnStart()-Methode

08/02/2011 - 15:30 von Stefanie Wiemann | Report spam
Hallo,

mein Problem ist folgendes:

Ich habe einen Windows Service in C# geschrieben, der beim Start auf
einen Fehler laufen kann. Dieser Fehler ist berechtigt: falscher
Service-User, dem Rechte für andere benötigte Dinge fehlen.
Da dieser Fehler durch falsche Konfiguration auftritt, was auch im
normalen Betrieb mal passieren kann, möchte ich ihn vernünftig
abfangen und ausgeben.

Es gibt zwei Möglichkeiten, den Service zu starten:
1. Über die Windows-Dienste-Konsole: dort bekomme ich nach einem Start-
Versuch ein Dialogfenster mit folgender Fehlermeldung:
"Dienst "MyService" wurde auf "Lokaler Computer" gestartet und dann
angehalten. Einige Dienste werden automatisch angehalten, wenn sie
nicht von anderen Diensten oder Programmen verwendet werden."

Das ist zwar nicht besonders aussagekràftig und außerdem inhaltlich
falsch, aber zumindest wird der Dienst wieder sauber beendet (soweit
ich das beurteilen kann), ohne daß sich irgendwas aufhàngt.

2. Über eine selbstgeschriebene C#-Applikation, die zur Konfiguration
des Dienstes dient.
Wenn ich den Dienst von dort aus starte, bleibt die Applikation
hàngen. Ich muß sie dann beenden und neu starten, um überhaupt
irgendwas machen zu können.

Die OnStart() Methode des Services sieht etwa so aus:

protected override void OnStart(string[] args)
{
try
{
// hier wird die Initalisierung ausgeführt und hier tritt auch
der Fehler auf
...
}
catch (Exception ex)
{
// dieser Eintrag taucht im Logfile auf (bei beiden
Startvarianten), d.h. im Fehlerfall landet die Ausführung hier
logger.Error("OnStart threw an Exception.", ex);
throw;
}
}

Der Ablauf ist auch so, wie er sein soll, d.h. im try-Block kommt es
zum Fehler, daraufhin wird die Exception im catch-Block protokolliert.
Und da der Dienst nicht einfach fehlerhaft weiterlaufen soll, werfe
ich die Exception wieder.

Was muß ich hier evtl noch tun, um bei Startmethode 2 den Dienst
wieder sauber zu stoppen, ohne daß die Applikation hàngenbleibt?
Und was kann ich bei Methode 1 tun, damit eine sinnvollere
Fehlermeldung im Dialogfenster erscheint?

Bin für jeden Hinweis dankbar!

Gruß
Steffi

PS: Ich verwende auch einen UnhandledExceptionEventHandler, der im
Service-Konstruktor initialisiert wird.
Der wird hier aber nicht ausgeführt, zumindest finde ich im Eventlog
nichts von dem, was der Handler eigentlich ausgeben müßte.
 

Lesen sie die antworten

#1 Martin Bürkle
10/02/2011 - 19:25 | Warnen spam
Hallo Steffi,

ich bin selbst nicht so in der ServiceProgrammierung von C# drin, aber
wàre es nicht sinnvoll im Catch - Block Deiner Start Methode den Dienst
zu beenden. Ich vermute, dass das Deinen Dienst in jedem Fall beendet.

Hoffe das hilft.

Gruß,
Martin

Am 08.02.2011 15:30, schrieb Stefanie Wiemann:
Hallo,

mein Problem ist folgendes:

Ich habe einen Windows Service in C# geschrieben, der beim Start auf
einen Fehler laufen kann. Dieser Fehler ist berechtigt: falscher
Service-User, dem Rechte für andere benötigte Dinge fehlen.
Da dieser Fehler durch falsche Konfiguration auftritt, was auch im
normalen Betrieb mal passieren kann, möchte ich ihn vernünftig
abfangen und ausgeben.

Es gibt zwei Möglichkeiten, den Service zu starten:
1. Über die Windows-Dienste-Konsole: dort bekomme ich nach einem Start-
Versuch ein Dialogfenster mit folgender Fehlermeldung:
"Dienst "MyService" wurde auf "Lokaler Computer" gestartet und dann
angehalten. Einige Dienste werden automatisch angehalten, wenn sie
nicht von anderen Diensten oder Programmen verwendet werden."

Das ist zwar nicht besonders aussagekràftig und außerdem inhaltlich
falsch, aber zumindest wird der Dienst wieder sauber beendet (soweit
ich das beurteilen kann), ohne daß sich irgendwas aufhàngt.

2. Über eine selbstgeschriebene C#-Applikation, die zur Konfiguration
des Dienstes dient.
Wenn ich den Dienst von dort aus starte, bleibt die Applikation
hàngen. Ich muß sie dann beenden und neu starten, um überhaupt
irgendwas machen zu können.

Die OnStart() Methode des Services sieht etwa so aus:

protected override void OnStart(string[] args)
{
try
{
// hier wird die Initalisierung ausgeführt und hier tritt auch
der Fehler auf
...
}
catch (Exception ex)
{
// dieser Eintrag taucht im Logfile auf (bei beiden
Startvarianten), d.h. im Fehlerfall landet die Ausführung hier
logger.Error("OnStart threw an Exception.", ex);
throw;
}
}

Der Ablauf ist auch so, wie er sein soll, d.h. im try-Block kommt es
zum Fehler, daraufhin wird die Exception im catch-Block protokolliert.
Und da der Dienst nicht einfach fehlerhaft weiterlaufen soll, werfe
ich die Exception wieder.

Was muß ich hier evtl noch tun, um bei Startmethode 2 den Dienst
wieder sauber zu stoppen, ohne daß die Applikation hàngenbleibt?
Und was kann ich bei Methode 1 tun, damit eine sinnvollere
Fehlermeldung im Dialogfenster erscheint?

Bin für jeden Hinweis dankbar!

Gruß
Steffi

PS: Ich verwende auch einen UnhandledExceptionEventHandler, der im
Service-Konstruktor initialisiert wird.
Der wird hier aber nicht ausgeführt, zumindest finde ich im Eventlog
nichts von dem, was der Handler eigentlich ausgeben müßte.

Ähnliche fragen