.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); } } }
请问我遗漏了什么配置或步骤?
问题排查与解决
核心原因
- 服务身份权限不足:Windows服务默认以
Local Service身份运行,该账户对C:\WorkerService目录可能无写入权限,导致日志无法创建,同时启动流程因权限阻塞触发1053错误。 - 日志路径未指定绝对路径:直接写
serviceLog.txt会使用服务进程的工作目录(默认是C:\Windows\System32),而非发布目录,所以你在发布目录找不到日志。 - 未配置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
相关产品推荐
相关产品推荐

