Le service Windows sur l’ordinateur local a démarré et a ensuite arrêté l’erreur

D’habitude, j’obtiens cette erreur: (Le service “nom de service” sur l’ordinateur local a démarré puis s’est arrêté. Certains services s’arrêtent automatiquement s’ils ne sont pas utilisés par d’autres services ou programmes) les chemins de lecteur, etc. Le service Windows ne démarre pas.

J’ai un service Windows qui sauvegarde les dossiers / fichiers sur un emplacement s’il atteint la taille limite. Les détails sont tous fournis par une configuration XML que le service Windows lit au démarrage. J’ai un formulaire Windows distinct qui a un bouton qui fait exactement ce que fait le service de mon service Windows. J’utilise mes formulaires Windows pour déboguer le code avant de le mettre dans mon service Windows.

Lorsque je démarre mes formulaires Windows. Il fait ce qu’il suppose de faire. Lorsque je mets mon code dans la méthode du service Windows OnStart (), l’erreur est apparue.

Voici mon code:

protected override void OnStart(ssortingng[] args) { private static ssortingng backupConfig = @"D:\LogBackupConfig\backupconfig.xml"; private static ssortingng serviceStat = @"D:\LogBackupConfig\Status.txt"; private static ssortingng fileFolderStat = @"D:\LogBackupConfig\FileFolderStat.txt"; protected override void OnStart(ssortingng[] args) { if (File.Exists(backupConfig)) { FileSystemWatcher watcher = new FileSystemWatcher(); XmlTextReader reader = new XmlTextReader(backupConfig); XmlNodeType type; List listFile = new List(); ssortingng fileWatch = ""; //this loop is for reading XML elements and assigning to variables while (reader.Read()) { type = reader.NodeType; if (type == XmlNodeType.Element) { if (reader.Name == "File") { reader.Read(); fileWatch = reader.Value; } else if (reader.Name == "Folder") { reader.Read(); fileWatch = reader.Value; } } } reader.Close(); watcher.Path = fileWatch; watcher.Filter = "*.*"; //this loop reads whether the service will watch a file/folder XmlTextReader reader1 = new XmlTextReader(backupConfig); while (reader1.Read()) { type = reader1.NodeType; if (type == XmlNodeType.Element) { if (reader1.Name == "File") { watcher.IncludeSubdirectories = false; watcher.Changed += new FileSystemEventHandler(OnChangedFile); } else if (reader1.Name == "Folder") { watcher.IncludeSubdirectories = true; watcher.Changed += new FileSystemEventHandler(OnChangedFolder); } } } reader1.Close(); watcher.EnableRaisingEvents = true; } else { StreamWriter sw = new StreamWriter(serviceStat, true); sw.WriteLine("File not found. Please start the Log Backup UI first."); sw.Close(); } } 

Je ne sais pas ce qui empêche le service Windows de démarrer, le simulateur de formulaire Windows fonctionnait bien. Quel semble être le problème?

MISE À JOUR: Après plusieurs essais, j’ai remarqué qu’en utilisant uniquement un répertoire de dossiers (sans fichier), le service Windows ne fonctionnait pas. Lorsque j’ai remplacé la variable fileWatch par un fichier spécifique (y compris son répertoire), le service Windows a démarré. Lorsque je l’ai ramené à un emplacement de dossier, cela n’a pas fonctionné. Ce que je pense, c’est que l’emplacement des dossiers ne fonctionne pas dans un observateur de fichiers.

Lorsque j’ai essayé de créer un nouveau service Windows qui surveille un emplacement de dossier, cela a fonctionné. Cependant, lorsque j’ai essayé le même emplacement dans mon service Windows d’origine, cela n’a pas fonctionné! J’avais l’esprit # # * ed! Il me semble que je dois créer un nouveau service Windows et créer l’installateur chaque fois que je place un nouveau code / une nouvelle fonction. De cette façon, je peux garder une trace de l’erreur.

Si le service démarre et s’arrête comme ça, cela signifie que votre code lance une exception non gérée. C’est assez difficile à déboguer, mais il y a quelques options.

  1. Consultez l’Observateur d’ événements Windows. Vous pouvez normalement y accéder en accédant au gestionnaire de l’ordinateur / au serveur, puis en cliquant sur Observateur d’événements -> Journaux Windows -> Application . Vous pouvez voir ce qui a jeté l’exception ici, ce qui peut aider, mais vous n’obtenez pas la trace de la stack.
  2. Extrayez votre logique de programme dans un projet de classe de bibliothèque. Créez maintenant deux versions différentes du programme: une application de console (pour le débogage) et le service Windows. (C’est un peu d’effort initial, mais cela évite beaucoup d’anxiété à long terme.)
  3. Ajoutez plus de blocs try / catch et connectez-vous à l’application pour obtenir une meilleure image de ce qui se passe.

Vous ne savez pas si cela sera utile, mais pour déboguer un service, vous pouvez toujours utiliser les méthodes suivantes dans la méthode OnStart:

 protected override void OnStart(ssortingng[] args) { System.Diagnostics.Debugger.Launch(); ... } 

que vous pourriez attacher votre studio visuel au processus et avoir de meilleures capacités de débogage.

J’espère que c’était utile, bonne chance

J’ai trouvé très pratique de convertir votre service Windows existant en console en changeant simplement votre programme avec les éléments suivants. Avec cette modification, vous pouvez exécuter le programme en déboguant dans Visual Studio ou en exécutant normalement le fichier exécutable. Mais cela fonctionnera aussi comme un service Windows. J’ai aussi fait un blog à ce sujet

program.cs

 class Program { static void Main() { var program = new YOUR_PROGRAM(); if (Environment.UserInteractive) { program.Start(); } else { ServiceBase.Run(new ServiceBase[] { program }); } } } 

YOUR_PROGRAM.cs

 [RunInstallerAtsortingbute(true)] public class YOUR_PROGRAM : ServiceBase { public YOUR_PROGRAM() { InitializeComponent(); } protected override void OnStart(ssortingng[] args) { Start(); } protected override void OnStop() { //Stop Logic Here } public void Start() { //Start Logic here } } 

Veuillez vérifier que vous avez enregistré tous les points de terminaison HTTP dans la liste de contrôle d’access (ACL) de mahcine locale

http://just2thepoint.blogspot.fr/2013/10/windows-service-on-local-computer.html

EventLog.Log doit être défini comme “Application”

Utilisez la timer et cochez événement pour copier vos fichiers.

Au démarrage du service, lancez l’heure et spécifiez l’intervalle dans le temps.

Ainsi, le service continue de fonctionner et copie les fichiers ontick.

J’espère que ça aide.

Vous voudrez peut-être tester l’unité de l’initialisation, mais comme c’est la méthode OnStart , c’est presque impossible. Je suggère de déplacer le code d’initialisation dans une classe distincte afin qu’il puisse être testé ou au moins réutilisé dans un testeur de formulaire.

Ensuite, append une journalisation (à l’aide de Log4Net ou similaire) et append une journalisation détaillée afin que vous puissiez voir les détails des erreurs d’exécution. Des exemples d’erreurs d’exécution seraient AccessViolation particulier si votre service est exécuté sans suffisamment de privilèges pour accéder aux fichiers de configuration.

Le compte qui exécute le service n’a peut-être pas mappé le D: -drive (ils sont spécifiques à l’utilisateur). Essayez de partager le répertoire et utilisez le chemin UNC complet dans votre backupConfig .

Votre watcher de type FileSystemWatcher est une variable locale et est hors de scope lorsque la méthode OnStart est terminée. Vous en avez probablement besoin comme instance ou variable de classe.

Je suis tombé sur le même problème. Mon service télécharge / reçoit XMLS et écrit les erreurs dans le journal des événements.

Lorsque je suis allé au journal des événements, j’ai essayé de le filtrer. Il m’invite que le journal des événements était corrompu.

J’ai effacé le journal des événements et tout est OK.