2009-11-04 21 views
33

Escribí un servicio de Windows en C# que básicamente verifica mi DN cada minuto para pedidos, genera un PDF a partir de estos pedidos y lo envía por correo electrónico.Error 1053 el servicio no respondió a la solicitud de inicio o control

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

cuando se crea el servicio, e instalarlo mediante el proyecto de instalación, cuando voy a iniciar el servicio en el MMC de servicios, me sale:

el error 1053 el servicio no respondió a la solicitud de inicio o control de una forma 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 me estoy equivocando?

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 en el que se consulta la base de datos y archivos PDF se generan 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(); 
    } 
} 
+3

¿Qué hay en su constructor sin embargo? El problema podría estar allí. –

+0

todo lo que tengo en mi contstructor es this.CanPauseAndContinue = true; this.ServiceName = "Crocus_PurchaseOrderGenerator"; – Alex

+1

¿Dónde instancia el temporizador? Eche un vistazo al ejemplo que publiqué a continuación (http://clifgriffin.com/2008/11/20/using-timers-in-ac-windows-service/) sobre cómo configurar el temporizador en un servicio de Windows – SwDevMan81

Respuesta

25

De MSDN:
"No utilice el constructor para realizar el procesamiento que debe 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. Cuando continúa, por ejemplo, el constructor no es llamado de nuevo porque el SCM ya tiene el objeto en la memoria. Si OnStop libera 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, podría ser un problema. también comprobaría el tipo de temporizador, asegúrese de que es un System.Timers.Timer de Servicios. Here es un ejemplo de cómo configurar el temporizador en un servicio de windows.

//TODONT: Use a Windows Service just to run a scheduled process

probé su código , y parece estar bien. La única diferencia que tuve fue codificar el valor del temporizador (Service1.cs). Déjenme saber 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 añadir el siguiente para que pudiera funcionar installutil.exe y se unen a los anteriores para ver si el evento 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); 
     } 
    } 
} 
+0

tengo una situación diferente aquí. Mi servicio de Windows está comenzando bien en la mayor parte del sistema. pero en pocos sistemas estoy enfrentando el error 1503:. Intenté soluciones regedit. necesita ayuda –

25

Acabo de tener el mismo problema.

Resultó que era porque yo estaba corriendo como una consola en modo de depuración - al igual que el código que tiene por encima de

#if (!DEBUG) 

#else //debug code 

#endif 

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

cuando he compilado en modo de lanzamiento funcionó como se esperaba

esperanza esto ayuda

+3

¡Amigo! ¡Me siento estupido! – Jmorvan

+0

Déjà vu ..... :) –

1

voy a la consola del servidor (en la sala de servidores) e iniciar el servicio desde allí. Remoto en el trabajo no.

0

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).

1

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

lo tanto, tratar de comprobar su archivo .config antes de la perforación de su ordenador;)

+2

Siempre es una buena idea cambiar el nombre de la configuración a xml y abrirla en el visor xml predeterminado para permitirle comprobar si hay errores. –

+0

Personalmente sugiero elegir "Abrir con" en el menú contextual (y asegúrese de desmarcar "abrir siempre con esta aplicación"). Podría ser más fácil, a largo plazo, que renombrar el archivo de ida y vuelta. – Cornelius

+0

También tuve un problema con el archivo de configuración. Tuve un carácter extra '' 'que causaba el problema. – Fer

8

En el caso de cualquier otra persona ejecuta a través de esto en el futuro, que recibió el mismo error 1053 al intentar iniciar Windows en mi servicio Windows Server 2012.

El problema fue que el servicio se desarrolló con el .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.

+0

Esto funcionó para mí. Me dirigía a 4.6 y funcionaría en mi máquina, luego fui a instalar y una máquina de Windows Server 2008 que tiene 4.51 y no funcionó. ¡Cambié el objetivo a 4.51 auge! – mauricioSanchez

+0

Me salvaste el día ... Gran idea. +1 –

+0

También fue mi problema. Gracias! – Eugene

0

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 para .Net 4.0. Ahora funciona bien.

0

Lo primero que se ejecuta desde el conjunto que contiene el servicio es el método Main. Y tiene que tomar medidas especiales, o por lo menos una de estas acciones:

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

Eso es lo que he descubierto después de pruebas y errores de sesión cuando la creación de mi primer servicio. No usé VS. Utilicé VS guía (Walkthrough: Creating a Windows Service Application in the Component Designer), mientras que yo debería usar este: Creating a C# Service Step-by-Step: Lesson I.

Sin método adecuado 'principal' el ejecutable termina inmediatamente y el sistema informa de que se ha superado el tiempo de espera de 30 segundos :)

2

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 la puesta en marcha menú de búsqueda cuadro de búsqueda de 'Servicios' -En Servicios de encontrar el servicio requerido -right haga clic en y seleccione la ficha Iniciar sesión : seleccione 'Esta cuenta' e introduzca el contenido requerido/credenciales - Ok e iniciar el servicio como de costumbre

enter image description here

+0

Si bien esto me ha ayudado a eludir un problema al iniciar mi servicio, al mismo tiempo, no es mi problema. es una buena solución para la pregunta. –

0

al igual que yo. En 4.6.1 no funciona (tengo el mismo mensaje). Luego trato de 4.5 y funciona bien.

0

Si el nombre de su servicio es diferente del nombre de archivo .exe real, asegúrese de no tener 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.

enter image description here

enter image description here

Cuestiones relacionadas