2008-10-01 22 views
16

Ich schreibe eine Reihe von Windows-Diensten. Ich möchte, dass sie fehlschlagen, wenn während des Startvorgangs Fehler auftreten (in OnStart() Methode). Ich hatte angenommen, dass nur ein Fehler in OnStart() würde dies tun, aber ich finde, dass stattdessen "Startet" und präsentiert mir mit einer Nachricht, die besagt "Der Dienst hat begonnen, ist aber inaktiv. Ist das korrekt?" (Paraphrase). Wie gehe ich mit dem Fehler um, sodass der Dienst nicht gestartet werden kann?Handle-Ausnahme beim Dienststart

Antwort

8

Wenn Sie .NET 2.0 oder höher ausführen, können Sie ServiceBase.Stop verwenden, um den Dienst von OnStart zu stoppen. Andernfalls rufe Stop von einem neuen Thread auf.

ref [devnewsgroups] ( http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx)

(News-Gruppe gegangen)

+0

die Referenzdomäne – hultqvist

+0

Internet Archive zur Rettung gegangen: https://web.archive.org/web/20070730021813/http://www.devnewsgroups.net/group/microsoft.public.dotnet. framework/topic50404.aspx –

7

Verschieben Sie Ihre gesamte Startlogik auf eine separate Methode und werfen Sie Exceptions (oder rufen Sie OnStop) von dieser separaten Methode ab.

OnStart hat einige Besonderheiten beim Starten. Ich habe gefunden, dass, wenn OnStart() nicht mehr als eine Zeile darin hat, dann bekomme ich nicht die "Der Dienst gestartet und dann gestoppt.Einige Dienste stoppen automatisch, wenn sie keine Arbeit zu tun haben" Nachricht, und geworfene Ausnahmen werden die beendet Verarbeiten und protokollieren Sie das App-Ereignisprotokoll.

Auch mit der separaten Startmethode können Sie eine Technik wie diese verwenden, um es zu debuggen, ohne anzuhängen. http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx

16

Wenn die Hauptsache Sie möchten, für das Dienste-Fenster ist zu berichten, dass es ein Fehler war, von dem, was ich habe versucht (.net 3.5 unter Windows 7), der einzige Weg, dies zu tun ist, indem Sie den ExitCode. Ich empfehle, es auf 13816 zu setzen, da dies die Meldung "Ein unbekannter Fehler ist aufgetreten" zur Folge hat. Siehe the windows error codes.

Das folgende Beispiel erfüllt drei Dinge. 1 - Einstellung ExitCode führt zu einer nützlichen Nachricht für den Endbenutzer. Es hat keine Auswirkungen auf das Windows-Anwendungsprotokoll, enthält jedoch eine Nachricht im Systemprotokoll. 2 - Calling Stop führt zu einer Meldung "Service erfolgreich gestoppt" im Anwendungsprotokoll. 3 - Das Auslösen der Ausnahme führt zu einem nützlichen Protokolleintrag im Anwendungsprotokoll.

protected override void OnStart(string[] args) { 

    try { 
    // Start your service 
    } 
    catch (Exception ex) { 
    // Log exception 
    this.ExitCode = 13816; 
    this.Stop(); 
    throw; 
    } 

} 
+1

13816 ist als IPSEC-Fehler gekennzeichnet, so dass es nicht genau zutrifft, aber jeder Nicht-Null-Int wird vom Service Control Manager als Fehler angesehen. Ich glaube, dass die Bedeutung des Codes dem Dienst selbst entspricht. – xr280xr

+2

Das ist ein sehr guter Punkt. Vielleicht wäre Code 1064 besser. (ERROR_EXCEPTION_IN_SERVICE - Bei der Verarbeitung der Steuerungsanforderung ist eine Ausnahme im Dienst aufgetreten.) Die Hauptidee für mich ist die Anzeige einer Nachricht an den Benutzer, die etwas hilfreich und insbesondere nicht irreführend ist. – Sean

+1

Die wichtigsten Teile sind die Einstellung der ExitCode und der Wurf. Es gibt keine Notwendigkeit für die 'Stop();' - der Ausnahmebehandler in ServiceBase tut dies. –

Verwandte Themen