错误1053服务未响应启动或控制请求

时间:2009-11-04 12:40:23

标签: c# windows error-handling windows-services

我在C#中编写了一个Windows服务,基本上每分钟都会检查我的数据库中的订单,从这些订单生成PDF并通过电子邮件发送。

逻辑在我的测试等中完美运行。

当我创建服务并使用安装项目安装它时,当我在服务mmc中启动服务时,我得到:

  

错误1053服务没有及时响应启动或控制请求

我的OnStart方法如下所示:

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

基本上,只需启用计时器......所以没有进程密集的呼叫。

我哪里错了?

我已经尝试将启动帐户设置为本地系统,网络服务等......没有任何作用!

编辑:

这是我的代码:( processPurchaseOrders是查询数据库并生成pdf等的方法...)

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

14 个答案:

答案 0 :(得分:28)

我遇到了同样的问题。

原来是因为我在调试模式下将其作为控制台运行 - 就像上面的代码一样

#if (!DEBUG)

#else //debug code

#endif

我已经在调试模式下编译并安装了服务

当我在发布模式下编译它时,它按预期工作

希望这有帮助

答案 1 :(得分:27)

来自MSDN
“不要使用构造函数来执行应该在OnStart中的处理。使用OnStart来处理服务的所有初始化。构造函数在应用程序的可执行文件运行时调用,而不是在服务运行时调用。可执行文件在OnStart之前运行。当你继续例如,由于SCM已经将对象保存在内存中,因此不会再次调用构造函数。如果OnStop释放在构造函数而不是OnStart中分配的资源,则第二次调用服务时将不会再次创建所需的资源。

如果您的计时器未在OnStart调用中初始化,则可能是一个问题。 我还会检查计时器的类型,确保它是一个System.Timers.Timer for Services。 Here是如何在Windows服务中设置计时器的示例。

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

我尝试了你的代码,似乎没问题。我唯一的区别是硬编码定时器值(Service1.cs)。如果以下内容不起作用,请告诉我。

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

我刚刚创建了一个空白的Windows服务项目并添加了以下内容,因此我可以运行installutil.exe并附加到上面以查看事件是否正在触发(并且确实如此)。

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

答案 2 :(得分:11)

如果将来遇到其他人,我在Windows Server 2012上尝试启动Windows服务时收到了相同的错误1053.

问题最终是该服务是针对.NET framework 4.5.1开发的,但Windows Server 2012实例没有安装该版本的.NET框架。将服务备份到目标.NET 4.0修复了错误。

答案 3 :(得分:2)

构造函数对我来说是个问题。构造函数必须抛出关于缺失DLL的重复。

我的问题:我缺乏创建安装程序的经验。我没有将依赖的DLL复制到安装文件夹中(我需要在创建主项目输出时选择发布构建配置)。

答案 4 :(得分:2)

这对我有用。基本上确保登录用户设置为正确的用户。但是,这取决于帐户基础结构的设置方式。在我的示例中,它使用的是AD帐户用户凭据。

在启动菜单搜索框中搜索“服务”  -In Services找到所需的服务   - 右键单击​​并选择“登录”选项卡   - 选择“此帐户”并输入所需的内容/凭据   - 然后像往常一样启动服务

enter image description here

答案 5 :(得分:1)

我转到服务器控制台(在服务器机房中)并从那里启动服务。远程不会工作。

答案 6 :(得分:1)

在我发现有多余的“&gt;”之前也有这个错误我的.config文件中的字符。

因此,在冲压计算机之前,请先尝试仔细检查.config文件;)

答案 7 :(得分:0)

在我的情况下;我试图安装.Net 3.5服务到Windows 2012服务器。在服务器中安装了.Net 4.0框架。

我将目标服务框架更改为.Net 4.0。现在它工作正常。

答案 8 :(得分:0)

从包含服务的程序集执行的第一件事是Main方法。它必须采取特殊行动,或至少采取一项此类行动:

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

这是我在创建第一个服务后在试验和错误会话后发现的。我没有使用VS.我确实使用了VS指南(Walkthrough: Creating a Windows Service Application in the Component Designer),而我宁愿使用这个指南:Creating a C# Service Step-by-Step: Lesson I

没有合适的&#39; Main&#39;方法可执行文件立即完成,系统报告超过30秒超时:)

答案 9 :(得分:0)

像我一样。在4.6.1中不起作用(我有相同的消息)。 然后我尝试4.5并且工作正常。

答案 10 :(得分:0)

如果您的服务名称与实际的.exe文件名不同,请确保您没有与位于同一文件夹中的服务同名的.exe,这会导致它失败。

在我的生活中,我有一项名为“索引读者”的服务。指向&#39;索引阅读器service.exe&#39;并在同一文件夹中的一个名为&#39; Index reader.exe&#39;。删除此问题解决了这个问题。

enter image description here

enter image description here

答案 11 :(得分:0)

我有同样的问题 但是在我的情况下,当我在发行时重建安装程序服务时。 再次安装该服务并运行, 该服务开始运行,没有任何问题

答案 12 :(得分:0)

当我看到这样的问题时,我总是先去检查事件查看器。它确实为初始调查和调试提供了更多重要的细节。

通常,我们会忘记事件查看器捕获未处理的.net运行时异常,这些异常可以在 Windows日志> 应用程序下找到,然后通过事件ID 1026 (。NET运行时)

进行过滤

enter image description here

答案 13 :(得分:0)

我在尝试运行 .Net Core 3.0.0 Windows 服务时遇到了同样的问题。解决方案表明 here 对我有用。但这里是它的要点:

添加 Microsoft.Extensions.Hosting.WindowsServices

.UseWindowsService() 添加 IHostBuilder

以下是示例:

using Microsoft.Extensions.Hosting;

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) =>
        {
            IHostEnvironment env = context.HostingEnvironment;
            config.SetBasePath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
            config.AddEnvironmentVariables();
            config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
            config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
        })
        .ConfigureLogging((context, logging) =>
        {
            logging.AddConfiguration(context.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
        })
        .ConfigureServices((context, services) =>
        {                    
            services.AddHostedService<Worker>();
        })
    .UseWindowsService();