在 Windows 服务中托管 ASP (.NET 6)

San*_*ndy 17 windows-services asp.net-core .net-6.0

我目前正在使用 WebHost 和 WebHostBuilder 在 Windows 服务中托管 ASP.NET (.NET 5) 应用程序。

.NET 6 引入了 WebApplication 和 WebApplicationBuilder。我如何使用它们来托管 Windows 服务?

awe*_*awg 44

您可以使用UseWindowsService()此处记录的扩展方法:

https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-6.0&tabs=visual-studio#app-configuration

与以前版本的情况一样,您需要安装Microsoft.Extensions.Hosting.WindowsServicesNuGet 包。

在 .NET 6 中实现此功能WebApplicationBuilder需要一种解决方法:

var webApplicationOptions = new WebApplicationOptions() { ContentRootPath = AppContext.BaseDirectory, Args = args, ApplicationName = System.Diagnostics.Process.GetCurrentProcess().ProcessName };
var builder = WebApplication.CreateBuilder(webApplicationOptions);

builder.Host.UseWindowsService();
Run Code Online (Sandbox Code Playgroud)

更新

Microsoft 更改了服务的创建方式来解决此问题。该--contentRoot参数应与 exe 一起使用。

sc config MyWebAppServiceTest binPath= "$pwd\WebApplication560.exe --contentRoot $pwd\"
Run Code Online (Sandbox Code Playgroud)
New-Service -Name {SERVICE NAME} -BinaryPathName "{EXE FILE PATH} --contentRoot {EXE FOLDER PATH}" -Credential "{DOMAIN OR COMPUTER NAME\USER}" -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@aweyeahdawg 你的答案有效,但有一个技巧。调用 UseWindowsService() 会更改使用 WebApplicationBuilder.Host 不支持的内容根。我必须这样做: WebApplicationOptions webApplicationOptions = new() { ContentRootPath = AppContext.BaseDirectory, Args = args, ApplicationName = System.Diagnostics.Process.GetCurrentProcess().ProcessName }; var builder = WebApplication.CreateBuilder(webApplicationOptions); builder.Host.UseWindowsService(); (9认同)
  • @Sandy,这就是我一直在寻找的。拥有其他一切,但是无法弄清楚到底发生了什么。 (2认同)