前言
使用 Visual Studio 中的 Worker Service項目模板:
我們很容易創建出 Windows Service:
IHost?host?=?Host.CreateDefaultBuilder(args).UseWindowsService().ConfigureServices(services?=>{services.AddHostedService<Worker>();}).Build();await?host.RunAsync();
需要引用 NuGet 包Microsoft.Extensions.Hosting.WindowsServices
但是,當我們想把 ASP.NET Core 應用注冊成 Windows Service 時,卻碰到了一些麻煩。
Demo
創建 ASP.NET Core 應用,然后把 Worker Service 中的代碼復制過來:
var?builder?=?WebApplication.CreateBuilder(args);builder.Host.UseWindowsService()
.ConfigureServices(services?=>
{services.AddHostedService<Worker>();
});var?app?=?builder.Build();app.MapGet("/",?()?=>?"Hello?MyIO!");app.Run();
需要注意的是:與 Worker Service 不同,在 ASP.NET Core 應用中,需要通過builder.Host
拿到IHostBuilder
的實例。
使用sc create
注冊 Windows Service 成功。
但是在啟動時,卻提示 1053 錯誤:
通過事件查看器,我們發現導致錯誤的原因是當前工作目錄是C:\WINDOWS\system32
而不是我們的 ASP.NET Core 應用所在目錄:
解決方案
1. 修改工作目錄
雖然在 Windows Service 屬性窗口中不能設置工作目錄,但是我們可以在啟動時修改當前工作目錄:
Directory.SetCurrentDirectory(AppContext.BaseDirectory);var?builder?=?WebApplication.CreateBuilder(args);
2. 設置 ContentRootPath
既然是ContentRootPath
不正確導致的錯誤,那我們就按照錯誤提示使用 WebApplicationOptions 設置正確的ContentRootPath
即可:
var?builder?=?WebApplication.CreateBuilder(new?WebApplicationOptions
{ContentRootPath?=?AppContext.BaseDirectory,Args?=?args
});
結論
通過 2 種解決方案,我們都可以成功將 ASP.NET Core 應用注冊成 Windows Service 并運行。
添加微信號【MyIO666】,邀你加入技術交流群