web-dev-qa-db-fra.com

Erreur 1053, le service n'a pas répondu à la demande de démarrage ou de contrôle

J'ai écrit un service Windows en C # qui vérifie mes commandes toutes les minutes, génère un PDF à partir de ces commandes et l'envoie par courrier électronique.

La logique fonctionne parfaitement dans mes tests, etc.

Lorsque je crée le service et que je l'installe à l'aide du projet d'installation, lorsque je lance le service dans les services mmc, je reçois:

erreur 1053 le service n'a pas répondu à la demande de démarrage ou de contrôle en temps voulu

Ma méthode OnStart ressemble à ceci:

protected override void OnStart(string[] args)
{
    //writeToWindowsEventLog("Service started", EventLogEntryType.Information);
    timer.Enabled = true;
}

Fondamentalement, active simplement la minuterie ... afin qu'il n'y ait pas d'appel intensif en processus.

Où vais-je mal?

J'ai essayé de configurer le compte de démarrage sur le système local, le service réseau, etc. Rien ne fonctionne!

Modifier:

Voici mon code: (processPurchaseOrders est la méthode où la base de données est interrogée et où les fichiers PDF sont générés, etc.)

public partial class PurchaseOrderDispatcher : ServiceBase
{
    //this is the main timer of the service
    private System.Timers.Timer timer;

    public PurchaseOrderDispatcher()
    {
        InitializeComponent();
    }

    // The main entry point for the process
    static void Main()
    {
      #if (!DEBUG)
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new PurchaseOrderDispatcher() };
        ServiceBase.Run(ServicesToRun);
      #else //debug code
        PurchaseOrderDispatcher service = new PurchaseOrderDispatcher();
        service.processPurchaseOrders();
      #endif
    }

    private void InitializeComponent()
    {
        this.CanPauseAndContinue = true;
        this.ServiceName = "Crocus_PurchaseOrderGenerator";
    }

    private void InitTimer()
    {
        timer = new System.Timers.Timer();

        //wire up the timer event
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);

        //set timer interval
        var timeInSeconds = Convert.ToInt32(ConfigurationManager.AppSettings["TimerIntervalInSeconds"]);
        timer.Interval = (timeInSeconds * 1000); // timer.Interval is in milliseconds, so times above by 1000

        timer.Enabled = true;
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
            components.Dispose();

        base.Dispose(disposing);
    }

    protected override void OnStart(string[] args)
    {
        //instantiate timer
        Thread t = new Thread(new ThreadStart(this.InitTimer));
        t.Start();
    }

    protected override void OnStop()
    {
        //turn off the timer.
        timer.Enabled = false;
    }

    protected override void OnPause()
    {
        timer.Enabled = false;

        base.OnPause();
    }

    protected override void OnContinue()
    {
        timer.Enabled = true;

        base.OnContinue();
    }

    protected void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        processPurchaseOrders();
    }
}
36
Alex

De MSDN :
"N'utilisez pas le constructeur pour effectuer un traitement qui devrait être dans OnStart. Utilisez OnStart pour gérer toute l'initialisation de votre service. Le constructeur est appelé lorsque l'exécutable de l'application est exécuté, pas lorsque le service est exécuté. L'exécutable s'exécute avant OnStart. Lorsque vous continuez, par exemple, le constructeur n'est pas appelé à nouveau car le SCM conserve déjà l'objet en mémoire. Si OnStop libère les ressources allouées dans le constructeur plutôt que dans OnStart, les ressources nécessaires ne seront pas créées à nouveau lors de la deuxième utilisation du service. appelé."

Si votre minuterie n’est pas initialisée dans l’appel OnStart, cela pourrait être un problème… .. Je vérifierais également le type de minuterie, assurez-vous qu’il s’agit d’un System.Timers.Timer for Services. Ici est un exemple de configuration du minuteur dans un service Windows.

// TODONT: utiliser un service Windows uniquement pour exécuter un processus planifié

J'ai essayé votre code et il semble bien. La seule différence que j'avais était de coder en dur la valeur du minuteur (Service1.cs). Faites-moi savoir si le ci-dessous ne fonctionne pas.

Service1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using System.Threading;

namespace WindowsServiceTest
{
    public partial class Service1 : ServiceBase
    {
        private System.Timers.Timer timer;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            //instantiate timer
            Thread t = new Thread(new ThreadStart(this.InitTimer)); 
            t.Start();
        }

        protected override void OnStop()
        {
            timer.Enabled = false;
        }

         private void InitTimer()  
         {     
             timer = new System.Timers.Timer();  
             //wire up the timer event 
             timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
             //set timer interval   
             //var timeInSeconds = Convert.ToInt32(ConfigurationManager.AppSettings["TimerIntervalInSeconds"]); 
             double timeInSeconds = 3.0;
             timer.Interval = (timeInSeconds * 1000); 
             // timer.Interval is in milliseconds, so times above by 1000 
             timer.Enabled = true;  
         }

        protected void timer_Elapsed(object sender, ElapsedEventArgs e) 
        {
            int timer_fired = 0;
        }
    }
}

Service1.Designer.cs

namespace WindowsServiceTest
{
    partial class Service1
    {
        /// <summary> 
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary> 
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
            this.ServiceName = "Service1";
            this.CanPauseAndContinue = true;
        }

        #endregion
    }
}

Je viens de créer un projet de service Windows vierge et d’ajouter le texte ci-dessous pour pouvoir exécuter installutil.exe et l’attacher à ce qui précède pour voir si l’événement se déclenche (c’est ce qui s’est produit).

using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.ServiceProcess;

namespace WindowsServiceTest
{
    [RunInstaller(true)]
    public class MyServiceInstaller : System.Configuration.Install.Installer
    {
        public MyServiceInstaller()
        {
            ServiceProcessInstaller process = new ServiceProcessInstaller();

            process.Account = ServiceAccount.LocalSystem;

            ServiceInstaller serviceAdmin = new ServiceInstaller();

            serviceAdmin.StartType = ServiceStartMode.Manual;
            serviceAdmin.ServiceName = "Service1";
            serviceAdmin.DisplayName = "Service1 Display Name";
            Installers.Add(process);
            Installers.Add(serviceAdmin);
        }
    }
}
27
SwDevMan81

Je viens d'avoir le même problème.

Il s’est avéré que c’était parce que je l’utilisais comme console en mode débogage - comme le code que vous avez ci-dessus

#if (!DEBUG)

#else //debug code

#endif

Et je l'avais compilé en mode débogage et installé le service

Quand je l'ai compilé en mode release, cela a fonctionné comme prévu

J'espère que cela t'aides

27
ChrisCa

Au cas où quelqu'un d'autre rencontrerait cela à l'avenir, j'ai reçu la même erreur 1053 en essayant de démarrer mon service Windows sur Windows Server 2012.

Le problème a fini par être que le service avait été développé en ciblant le .NET Framework 4.5.1, mais cette version du Framework .NET n'était pas installée sur l'instance de Windows Server 2012. La sauvegarde du service sur la cible .NET 4.0 a corrigé l'erreur.

11
Aaron

Cela a fonctionné pour moi. En gros, assurez-vous que l’utilisateur d’ouverture de session est bien configuré. Cependant, cela dépend de la configuration de l’infrastructure du compte. Dans mon exemple, il utilise les informations d'identification de l'utilisateur du compte AD. 

Dans la boîte de recherche du menu de démarrage, recherchez «Services» -In Services trouve le service requis -right cliquez sur et sélectionnez l'onglet Connexion -Sélectionnez 'Ce compte' et entrez le contenu/informations d'identification requis -Ok et lance le service comme d'habitude

 enter image description here

2
d689p

Le constructeur était le problème pour moi. Le constructeur doit avoir lancé une excuse sur les DLL manquantes.

Mon problème: mon inexpérience dans la création d’installateurs. Je n'avais pas copié les DLL dépendantes dans le dossier d'installation (j'avais besoin de sélectionner Libérer la configuration de génération lors de la création d'une sortie de projet primaire).

1
AndyClaw

Je vais à la console du serveur (dans la salle des serveurs) et lance le service à partir de là. La télécommande ne fonctionnera pas.

1
vnRock

Également eu cette erreur jusqu'à ce que j'ai découvert qu'il y avait un caractère ">" en excès sur mon fichier .config.

Alors, essayez de vérifier votre fichier .config avant de perforer votre ordinateur;)

1
SyntaxError

Si le nom de votre service diffère du nom de fichier .exe actuel, assurez-vous de ne pas avoir un fichier .exe portant le même nom que le service situé dans le même dossier, car cela provoquerait son échec. 

Dans ma situation, j'avais un service appelé "Index Reader" pointant vers "Index reader service.exe" et dans le même dossier un fichier exe appelé "Index reader.exe". Supprimer ce problème corrigé le problème.

 enter image description here

 enter image description here

0
David Lindon

Dans mon cas; J'essayais d'installer un service .Net 3.5 sur un serveur Windows 2012. Sur le serveur, le framework .Net 4.0 a été installé. 

Je change la structure de service cible en .Net 4.0. Maintenant cela fonctionne bien.

0
Orcun

J'avais le même problème Mais dans mon cas, lorsque je reconstruisais les services du programme d'installation à la parution . Installez le service à nouveau et exécutez,

0
Misha Beskin

Comme moi. Dans 4.6.1 ne fonctionne pas (j'ai le même message) . Puis j'essaie dans 4.5 et fonctionne bien.

0
Ruben Collazos

La première chose exécutée à partir de l'assembly contenant le service est la méthode Main . Et il doit prendre des actions spéciales, ou au moins une de ces actions:

public static int Main()
{
  Run(new System.ServiceProcess.ServiceBase[] { new YourServiceClass() });
}

C'est ce que j'ai découvert après une session d'essais et d'erreurs lors de la création de mon premier service. Je n'ai pas utilisé VS. J'ai utilisé le guide VS ( Procédure pas à pas: création d'une application de service Windows dans Component Designer ), alors que je devrais plutôt utiliser celui-ci: Création étape par étape d'un service C #: Leçon I .

Sans la méthode 'Main' appropriée, l'exécutable se termine immédiatement et le système signale qu'un délai d'attente de 30 secondes a été dépassé :)

0
Jarekczek