.NET Core 6.0服务无法通过服务控制台启动(错误1053)

问题描述 投票:0回答:1

我使用VS 2022中的worker服务模板创建了一个新的Windows服务“WorkerService”,平台是.NET 6。

程序本身可以运行,每秒显示一条日志“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);
        }
    }
}

我错过了什么?

c# .net service .net-6.0
1个回答
0
投票

要将您的服务托管在 Windows 服务中,您需要调用

UseWindowsService

您需要对 Microsoft.Extensions.Hosting.WindowsServices.

的 NuGet 包引用。
Host.CreateDefaultBuilder(args)
    // ... other calls
    .UseWindowsService(options =>
    {
        options.ServiceName = "WorkerService1";
    })
    // ... other calls

请参阅使用BackgroundService创建Windows服务

© www.soinside.com 2019 - 2024. All rights reserved.