.NET 6 中将 ASP.NET Core 注册成 Windows Service
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET 6 中将 ASP.NET Core 注册成 Windows Service相关的知识,希望对你有一定的参考价值。
前言
使用 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】,邀你加入技术交流群
以上是关于.NET 6 中将 ASP.NET Core 注册成 Windows Service的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET Core 2.0 中将 DataTable 转换为 IEnumerable<T>
在 ASP.NET Core 中将 html 导出为 pdf
防止 AddRedirectToWwwPermanent() 在 ASP.NET Core 2.1 中将“www”添加到 *.azurewebsites.net 的前面