我使用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);
}
}
}
我错过了什么?
要将您的服务托管在 Windows 服务中,您需要调用
UseWindowsService
。
您需要对 Microsoft.Extensions.Hosting.WindowsServices.
的 NuGet 包引用。Host.CreateDefaultBuilder(args)
// ... other calls
.UseWindowsService(options =>
{
options.ServiceName = "WorkerService1";
})
// ... other calls