update timely tiempo the start solicitud servicio respondió respondio respond oportuna not manera inicio fashion error did control agente c# windows error-handling windows-services

c# - timely - Error 1053 el servicio no respondió a la solicitud de inicio o control



error 1053 el servicio no respondió a tiempo a la solicitud de inicio o de control windows update (11)

Escribí un servicio de Windows en C # que básicamente verifica mi DN por minuto para los pedidos, genera un PDF a partir de estos pedidos y lo envía por correo electrónico.

La lógica funciona perfectamente en mis pruebas, etc.

Cuando creo el servicio, y lo instalo usando el proyecto de instalación, cuando inicio el servicio en los servicios de mmc, obtengo:

error 1053 el servicio no respondió a la solicitud de inicio o control de manera oportuna

Mi método OnStart se ve así:

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

Básicamente, solo habilita el temporizador ... por lo que no hay llamadas intensivas de proceso allí.

¿Dónde estoy equivocado?

He intentado configurar la cuenta de inicio para el sistema local, el servicio de red, etc ... ¡nada funciona!

Editar:

Aquí está mi código: (processPurchaseOrders es el método donde se consulta el db y se generan los pdf, 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(); } }


Acabo de tener el mismo problema.

Resultó que era porque lo estaba ejecutando como una consola en modo de depuración, como el código que tienes arriba

#if (!DEBUG) #else //debug code #endif

Y lo había compilado en modo de depuración e instalado el servicio

Cuando lo compilé en modo de lanzamiento funcionó como se esperaba

Espero que esto ayude


Como yo. En 4.6.1 no funciona (tengo el mismo mensaje). Luego trato de 4.5 y trabajo bien.


Desde MSDN :
"No use el constructor para realizar el procesamiento que debería estar en OnStart. Use OnStart para manejar toda la inicialización de su servicio. Se llama al constructor cuando se ejecuta el ejecutable de la aplicación, no cuando se ejecuta el servicio. El ejecutable se ejecuta antes de OnStart. por ejemplo, el constructor no se vuelve a llamar porque el SCM ya contiene el objeto en la memoria. Si OnStop libera los recursos asignados en el constructor en lugar de en OnStart, los recursos necesarios no se crearán nuevamente la segunda vez que se llame al servicio.

Si su temporizador no se inicializa en la llamada OnStart, esto podría ser un problema. También verificaría el tipo de temporizador, asegúrate de que sea un System.Timers.Timer para Servicios. clifgriffin.com/2008/11/20/using-timers-in-a-c-windows-service hay un ejemplo de cómo configurar el temporizador en un servicio de Windows.

// TODONT: use un servicio de Windows solo para ejecutar un proceso programado

Probé tu código y parece estar bien. La única diferencia que tuve fue codificar el valor del temporizador (Service1.cs). Avísame si el siguiente no funciona.

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

Acabo de crear un proyecto de servicio de Windows en blanco y agregué el siguiente para poder ejecutar installutil.exe y adjuntarlo a lo anterior para ver si el evento se estaba disparando (y lo hizo).

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


El constructor fue el problema para mí. El constructor debe haber estado lanzando una excpetion sobre DLL faltantes.

Mi problema: mi inexperiencia con la creación de instaladores. No tenía los archivos DLL dependientes copiados en la carpeta de instalación (necesitaba seleccionar la configuración de versión de creación al crear la salida del proyecto principal).


En caso de que alguien más se encuentre con esto en el futuro, recibí el mismo error 1053 al intentar iniciar mi servicio de Windows en Windows Server 2012.

El problema terminó siendo que el servicio se desarrolló con el objetivo de .NET Framework 4.5.1, pero la instancia de Windows Server 2012 no tenía instalada la versión de .NET Framework. Retrocediendo el servicio al objetivo .NET 4.0 solucionó el error.


En mi caso; Estaba tratando de instalar un servicio .Net 3.5 en el servidor de Windows 2012. En el servidor, se instaló el framework .Net 4.0.

Cambio mi marco de trabajo de destino a .Net 4.0. Ahora funciona bien.


Esto funcionó para mí. Básicamente, asegúrese de que el usuario de inicio de sesión esté configurado correctamente. Sin embargo, depende de cómo esté configurada la infraestructura de la cuenta. En mi ejemplo, usa credenciales de usuario de la cuenta AD.

En el cuadro de búsqueda del menú de inicio, busque ''Servicios''. En Servicios, encuentre el servicio requerido, haga clic en y seleccione la pestaña Iniciar sesión. Seleccione ''Esta cuenta'' e ingrese el contenido / credenciales necesarios. Escúchela e inicie el servicio como siempre.


Lo primero que se ejecuta desde el ensamblado que contiene el servicio es el método Main . Y debe tomar acciones especiales, o al menos una de ellas:

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

Eso es lo que descubrí después de la sesión de ensayos y errores al crear mi primer servicio. No usé VS. Utilicé la guía VS ( Tutorial: Creación de una aplicación de servicio de Windows en el Diseñador de componentes ), aunque prefiero usar esta: Crear un servicio C # paso a paso: Lección I.

Sin el método ''Principal'' adecuado, el ejecutable finaliza inmediatamente y el sistema informa que se excedió el tiempo de espera de 30 segundos :)


Si el nombre de su servicio difiere del nombre real del archivo .exe, asegúrese de que no tiene un .exe con el mismo nombre que el servicio ubicado en la misma carpeta, ya que esto hará que falle.

En mi ubicación, tenía un servicio llamado ''Index Reader'' que apuntaba a ''Index reader service.exe'' y en la misma carpeta un exe llamado ''Index reader.exe''. Eliminar esto solucionó el problema.


También tuve este error hasta que descubrí que hay un exceso de carácter ">" en mi archivo .config.

Por lo tanto, intente verificar dos veces su archivo .config antes de perforar su computadora;)


Voy a la consola del servidor (en la sala del servidor) y comienzo el servicio desde allí. Remoto en el trabajo no.