it-swarm.com.de

Fehler 1053 Der Dienst hat auf die Start- oder Steuerungsanforderung nicht reagiert

Ich habe einen Windows-Dienst in C # geschrieben, der im Grunde jede Minute meine Bestellungen auf Bestellungen überprüft, aus diesen Bestellungen eine PDF generiert und diese per E-Mail sendet.

Die Logik funktioniert perfekt in meinen Tests usw.

Wenn ich den Dienst erstelle und mit dem Setup-Projekt installiere, wenn ich den Dienst in den Diensten mmc starte, erhalte ich Folgendes:

fehler 1053 Der Dienst hat auf die Start- oder Steuerungsanforderung nicht rechtzeitig reagiert

Meine OnStart-Methode sieht folgendermaßen aus:

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

Grundsätzlich aktiviert sich einfach der Timer ... da gibt es keinen prozessintensiven Anruf.

Wohin gehe ich falsch?

Ich habe versucht, das Startkonto auf lokales System, Netzwerkdienst usw. einzustellen. Nichts funktioniert!

Bearbeiten:

Hier ist mein Code: (processPurchaseOrders ist die Methode, bei der die Datenbank abgefragt wird und PDFs generiert werden usw.).

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

Von MSDN :
"Verwenden Sie nicht den Konstruktor, um eine Verarbeitung auszuführen, die sich in OnStart befinden sollte. Verwenden Sie OnStart, um die gesamte Initialisierung Ihres Dienstes zu behandeln. Der Konstruktor wird aufgerufen, wenn die ausführbare Datei der Anwendung ausgeführt wird, nicht wenn der Dienst ausgeführt wird. Die ausführbare Datei wird vor OnStart ausgeführt. Wenn Sie beispielsweise fortfahren, wird der Konstruktor nicht erneut aufgerufen, da der SCM das Objekt bereits im Arbeitsspeicher enthält. Wenn OnStop Ressourcen freigibt, die im Konstruktor statt in OnStart zugewiesen sind, werden die erforderlichen Ressourcen beim zweiten Mal, wenn der Service das zweite Mal ist, nicht erneut erstellt namens."

Wenn Ihr Timer beim OnStart-Aufruf nicht initialisiert wird, könnte dies ein Problem sein. Ich würde auch den Typ des Timers überprüfen. Stellen Sie sicher, dass es sich um einen System.Timers.Timer für Dienste handelt. Hier ist ein Beispiel für die Einrichtung des Timers in einem Windows-Dienst.

// TODONT: Verwenden Sie einen Windows-Dienst, um einen geplanten Prozess auszuführen

Ich habe Ihren Code ausprobiert und scheint ok zu sein. Der einzige Unterschied bestand darin, den Timerwert (Service1.cs) hart zu codieren. Lassen Sie mich wissen, wenn das unten nicht funktioniert.

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
    }
}

Ich habe gerade ein leeres Windows-Dienstprojekt erstellt und das unten angefügte hinzugefügt, damit ich installutil.exe ausführen und an das obige anhängen kann, um zu sehen, ob das Ereignis ausgelöst wurde (und es war der Fall).

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

Ich hatte gerade das gleiche Problem.

Es stellte sich heraus, dass ich es als Konsole im Debug-Modus ausgeführt habe - wie der Code, den Sie oben haben

#if (!DEBUG)

#else //debug code

#endif

Und ich hatte es im Debug-Modus kompiliert und den Dienst installiert

Als ich es im Release-Modus kompilierte, funktionierte es wie erwartet

Hoffe das hilft

27
ChrisCa

Für den Fall, dass irgendjemand anderen in der Zukunft darauf stößt, habe ich beim Versuch, meinen Windows-Dienst unter Windows Server 2012 zu starten, dieselbe Fehlermeldung 1053 erhalten.

Das Problem bestand schließlich darin, dass der Dienst für .NET Framework 4.5.1 entwickelt wurde, die Windows Server 2012-Instanz jedoch nicht über diese .NET Framework-Version verfügte. Durch Zurücksetzen des Dienstes auf das Ziel .NET 4.0 wurde der Fehler behoben.

11
Aaron

Das hat bei mir funktioniert. Vergewissern Sie sich grundsätzlich, dass der Benutzer "Anmelden" auf den richtigen Benutzer eingestellt ist. Es hängt jedoch davon ab, wie die Kontoinfrastruktur eingerichtet wird. In meinem Beispiel werden AD-Konto-Anmeldeinformationen verwendet. 

Suchen Sie im Startmenü nach "Services" -In Services finden Sie den erforderlichen Service Klicken Sie mit der rechten Maustaste auf und wählen Sie die Registerkarte Anmelden aus -Wählen Sie "Dieses Konto" und geben Sie den erforderlichen Inhalt bzw. die erforderlichen Anmeldeinformationen ein -Ok und starten Sie den Dienst wie gewohnt

 enter image description here

2
d689p

Der Konstruktor war für mich das Thema. Der Konstruktor muss eine Expetion über fehlende DLLs ausgelöst haben.

Mein Problem: Meine Unerfahrenheit beim Erstellen von Installern. Ich hatte nicht die abhängigen DLLs in den Installationsordner kopiert (ich musste beim Erstellen der Primärprojektausgabe die Option Build-Konfiguration freigeben auswählen).

1
AndyClaw

Ich gehe zur Serverkonsole (im Serverraum) und starte den Dienst von dort aus. Remote in der Arbeit.

1
vnRock

Hatte auch diesen Fehler, bis ich herausfand, dass sich in meiner .config-Datei ein ">" Zeichen befindet.

Bitte überprüfen Sie Ihre .config-Datei zuerst, bevor Sie Ihren Computer lochen;)

1
SyntaxError

Wenn der Name Ihres Dienstes vom tatsächlichen EXE-Dateinamen abweicht, vergewissern Sie sich, dass Sie keine EXE-Datei mit demselben Namen wie der Dienst im selben Ordner haben. 

In meiner Situation hatte ich einen Dienst namens "Index Reader", der auf "Index reader service.exe" und im selben Ordner eine Exe namens "Index reader.exe" verweist. Durch das Entfernen dieses Problems wurde das Problem behoben.

 enter image description here

 enter image description here

0
David Lindon

In meinem Fall; Ich habe versucht, einen .NET 3.5-Dienst auf dem Windows 2012-Server zu installieren. Auf dem Server wurde das .NET 4.0-Framework installiert. 

Ich ändere mein Ziel-Framework für den Service auf .NET 4.0. Jetzt funktioniert es gut.

0
Orcun

Ich hatte das gleiche Problem Aber in meinem Fall, wenn ich die Installer-Dienste bei Release .. neu aufbaue Installieren Sie den Dienst erneut, und führen Sie __ 

0
Misha Beskin

Wie ich. In 4.6.1 nicht funktionieren (ich habe die gleiche Nachricht) ..__ Dann versuche ich in 4.5 und arbeite gut.

0
Ruben Collazos

Das erste, was von der Assembly ausgeführt wird, die den Dienst enthält, ist die Methode Main . Und es muss spezielle Maßnahmen oder mindestens eine solche Maßnahme ergreifen:

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

Das habe ich nach Tests und Fehlern festgestellt, als ich meinen ersten Service erstellte. Ich habe VS nicht verwendet. Ich habe VS guide verwendet ( Exemplarische Vorgehensweise: Erstellen einer Windows-Dienstanwendung im Komponentendesigner ), während ich lieber Folgendes verwenden sollte: Erstellen eines C # -Dienstes Schritt für Schritt: Lektion I .

Ohne geeignete 'Main'-Methode wird die ausführbare Datei sofort beendet und das System meldet, dass das Timeout von 30 Sekunden überschritten wurde :)

0
Jarekczek