2008-10-01 11 views
16

J'écris une série de services Windows. Je veux qu'ils échouent si des erreurs sont lancées au démarrage (méthode OnStart()). J'avais supposé que le simple fait de lancer une erreur dans OnStart() le ferait, mais je trouve qu'à la place il "Démarre" et me présente un message indiquant "Le service a commencé, mais il est inactif. (Paraphrase). Comment puis-je gérer l'erreur afin qu'il ne parvienne pas réellement à démarrer le service?Gestion des exceptions au démarrage du service

Répondre

7

Déplacez l'ensemble de votre logique de démarrage vers une méthode distincte et Lancez des exceptions (ou appelez OnStop) à partir de cette méthode séparée.

OnStart a quelques bizarreries au démarrage. J'ai trouvé que si OnStart() n'a pas plus d'une ligne dedans, alors je ne reçois pas le message "Le service a commencé et s'est arrêté. Certains services s'arrêtent automatiquement s'ils n'ont pas de travail à faire", et les exceptions lancées se terminent le traiter et se connecter au journal des événements de l'application. En outre, avec la méthode de démarrage séparée, vous pouvez utiliser une technique comme celle-ci pour le déboguer sans l'attacher. Si vous exécutez .NET 2.0 ou supérieur, vous pouvez utiliser ServiceBase.Stop pour arrêter le service à partir de OnStart http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx

16

Si la principale chose que vous voulez est pour la fenêtre Services pour signaler qu'il y avait une erreur, d'après ce que je J'ai essayé (.net 3.5 sur Windows 7), le seul moyen de le faire est de régler le ExitCode. Je recommande de le définir à 13816, car cela entraîne le message "Une erreur inconnue s'est produite". Voir the windows error codes.

L'exemple ci-dessous accomplit trois choses. 1 - La définition de ExitCode génère un message utile pour l'utilisateur final. Cela n'affecte pas le journal des applications Windows mais inclut un message dans le journal système. 2 - L'arrêt de l'appel entraîne l'apparition d'un message indiquant que le service s'est arrêté avec succès dans le journal des applications. 3 - le lancement de l'exception entraîne une entrée de journal utile dans le journal des applications.

protected override void OnStart(string[] args) { 

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

} 
+1

13816 est étiqueté comme une erreur IPSEC donc il ne s'applique pas exactement, mais tout int non zéro est considéré comme une erreur par le gestionnaire de contrôle de service. Je crois que la signification du code dépend du service lui-même. – xr280xr

+2

C'est un très bon point. Peut-être que le code 1064 serait meilleur. (ERROR_EXCEPTION_IN_SERVICE - Une exception s'est produite dans le service lors de la gestion de la demande de contrôle.) L'idée principale pour moi est d'afficher un message à l'utilisateur quelque peu utile, et surtout pas trompeur. – Sean

+1

Les parties clés définissent le ExitCode et le lancer. Il n'y a pas besoin de 'Stop();' - le gestionnaire d'exceptions de ServiceBase fait cela. –

Questions connexes