You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6 WorkerService通过服务控制台启动失败(错误1053)

问题描述

我用VS 2022的Worker Service模板创建了基于.NET 6的Windows服务“WorkerService”,直接运行正常,每秒输出“Worker running...”日志。发布到C:\WorkerService后,通过PowerShell命令注册服务:

New-Service -Name "WorkerService1" -BinaryPathName "C:\WorkerService\WorkerService1.exe"

但通过服务控制台启动时,30秒后触发错误1053(提示“服务未及时响应启动或控制请求”),事件日志仅显示两条未及时响应的错误记录。直接用PowerShell运行服务却无异常。

为排查问题,我在启动代码中添加了日志记录逻辑:

using WorkerService1;

internal class Program
{
    private static StreamWriter? StreamWriter { get; set; }

    private static void Log(string message)
    {
        StreamWriter.WriteLine($"{DateTime.Now}: {message}");
        StreamWriter.Flush();
    }

    private static async Task Main(string[] args)
    {
        using (StreamWriter = new StreamWriter("serviceLog.txt"))
        {
            Log("Starting up...");
            try            
            {
                Log("Building...");
                IHost host = Host.CreateDefaultBuilder(args)
                .ConfigureServices(services =>
                {
                    services.AddHostedService<Worker>();
                }).Build();
                Log("Running...");
                await host.RunAsync();
            }
            catch (Exception e)
            {
                Log(e.ToString());
                throw;
            }
            Log("Shutting down...");
        }        
    }
}

交互式运行时日志可正常生成,但通过服务控制台启动时无日志输出,代码似乎未执行。Worker类为模板默认版本:

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await Task.Delay(1000, stoppingToken);
        }
    }
}

请问我遗漏了什么配置或步骤?


问题排查与解决

核心原因

  1. 服务身份权限不足:Windows服务默认以Local Service身份运行,该账户对C:\WorkerService目录可能无写入权限,导致日志无法创建,同时启动流程因权限阻塞触发1053错误。
  2. 日志路径未指定绝对路径:直接写serviceLog.txt会使用服务进程的工作目录(默认是C:\Windows\System32),而非发布目录,所以你在发布目录找不到日志。
  3. 未配置Windows服务托管适配:.NET Worker Service需要显式添加Windows服务托管配置,仅用New-Service注册不足以让系统正确识别并托管服务。

解决步骤

1. 添加Windows服务托管配置

修改Program.cs,在Host构建链中加入UseWindowsService()(需先安装对应NuGet包),同时指定日志文件的绝对路径:

using WorkerService1;
using Microsoft.Extensions.Hosting.WindowsServices;
using System.IO;

internal class Program
{
    private static StreamWriter? StreamWriter { get; set; }

    private static void Log(string message)
    {
        StreamWriter.WriteLine($"{DateTime.Now}: {message}");
        StreamWriter.Flush();
    }

    private static async Task Main(string[] args)
    {
        // 用绝对路径指定日志文件到发布目录
        var logPath = Path.Combine(AppContext.BaseDirectory, "serviceLog.txt");
        using (StreamWriter = new StreamWriter(logPath))
        {
            Log("Starting up...");
            try            
            {
                Log("Building host...");
                IHost host = Host.CreateDefaultBuilder(args)
                    // 添加Windows服务托管配置
                    .UseWindowsService(options =>
                    {
                        options.ServiceName = "WorkerService1";
                    })
                    .ConfigureServices(services =>
                    {
                        services.AddHostedService<Worker>();
                    }).Build();
                Log("Host built, running...");
                await host.RunAsync();
            }
            catch (Exception e)
            {
                Log($"Error: {e.ToString()}");
                throw;
            }
            Log("Shutting down...");
        }        
    }
}

2. 安装必要NuGet包

在项目中安装Microsoft.Extensions.Hosting.WindowsServices包,提供Windows服务托管支持:

Install-Package Microsoft.Extensions.Hosting.WindowsServices

3. 调整服务身份权限

  • 打开服务控制台,找到WorkerService1,右键选择属性→登录选项卡。
  • 测试阶段可选择本地系统账户(权限更高),生产环境建议使用专用服务账户;若需要调试,可勾选“允许服务与桌面交互”。
  • 或者给Local Service账户授予C:\WorkerService目录的读写权限。

4. 重新发布并注册服务

  • 重新发布项目到C:\WorkerService。
  • 删除旧服务(若已存在):
sc delete WorkerService1
  • 重新注册服务:
New-Service -Name "WorkerService1" -BinaryPathName "C:\WorkerService\WorkerService1.exe"

5. 验证日志

启动服务后,可在C:\WorkerService\serviceLog.txt查看启动日志,确认服务执行流程。


内容的提问来源于stack exchange,提问作者Udontknow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:05:56