ASP.NET Core .NET 6 预览版 7 Windows 服务

14

我使用 Visual Studio 2022 Preview 创建了一个新的 ASP.NET Core 项目,并尝试将其作为 Windows 服务运行。我下载了最新的 Microsoft.Extensions.Hosting.WindowsServices 包(6.0.0-preview.7.21377.19)。

在网上查找时,.UseWindowsService() 函数被用于 CreateHostBuilder 方法中。但在新模板中它看起来有所不同。我无法理解在新模板中应该在哪里调用 .UseWindowsService。这是我的当前代码,看起来服务正在启动,但当我浏览 localhost:5000 时,它给出了 404 错误。

using Microsoft.OpenApi.Models;
using Microsoft.Extensions.Hosting.WindowsServices;

var builder = WebApplication.CreateBuilder(args);

builder.Host.UseWindowsService(); // <--- Added this line

// Add services to the container.

builder.Services.AddControllers();
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new() { Title = "MyWindowsService", Version = "v1" });
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (builder.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
        app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyWindowsService v1"));
}

app.UseAuthorization();

app.MapControllers();


app.Run();
我发布了我的服务exe,就像这样。
dotnet publish -c Release -r win-x64 --self-contained

你能访问 http://localhost:5000/swagger/v1/swagger.json 吗? - Jason Pan
没有,而且似乎服务也没有启动。"MyService 服务由于以下错误无法启动:服务未能及时响应启动或控制请求。" - cvalueapp
错误似乎是这个:CoreCLR 版本:6.0.21.45113 .NET 版本:6.0.0-rc.1.21451.13 描述:由于未处理的异常,进程已终止。 异常信息:System.NotSupportedException: 内容根已更改。 不支持更改主机配置 在 Microsoft.AspNetCore.Builder.ConfigureHostBuilder.ConfigureHostConfiguration(Action`1 configureDelegate) 中 在 Microsoft.Extensions.Hosting.HostingHostBuilderExtensions.UseContentRoot(IHostBuilder hostBuilder, String contentRoot) - cvalueapp
如何创建这个项目?如果您想在Windows服务中托管ASP.NET Core,可以参考此文档 - Fei Xue - MSFT
@cvalueapp 你最终找到解决办法了吗? - user3071284
2个回答

30

仅仅使用

builder.Host.UseWindowsService();

不会与 WebApplication.CreateBuilder() (参见) 一起工作,而是会抛出异常。

Exception Info: System.NotSupportedException: The content root changed from "C:\Windows\system32\" to "...". Changing the host configuration using WebApplicationBuilder.Host is not supported. Use WebApplication.CreateBuilder(WebApplicationOptions) instead.

或者更确切地说,会导致这个错误

Start-Service : Service 'Service1 (Service1)' cannot be started due to the following error: Cannot start service Service1 on computer '.'.

当我在PowerShell中尝试使用Start-Service启动服务时,我发现一个适用于我的解决方法。

using Microsoft.Extensions.Hosting.WindowsServices;

var options = new WebApplicationOptions
{
    Args = args,
    ContentRootPath = WindowsServiceHelpers.IsWindowsService() ? AppContext.BaseDirectory : default
};

var builder = WebApplication.CreateBuilder(options);

builder.Host.UseWindowsService();

这里:

一个使用“UseWindowsService”方法的asp.net core web api应用程序,在启动服务时报错“System.NotSupportedException: The content root changed. Changing the host configuration is not supported ”。

1
这对我解决了问题。我和问题描述中完全一样的问题。正如cvalueapp在评论中解释的那样,启动服务失败是由于内容根目录的更改引起的异常。此答案展示了如何解决此问题。 - sbecker

3
以下代码将生命周期设置为WindowsServiceLifetime,启用将日志记录到事件日志中。在大多数情况下,这应该是您运行应用程序作为Windows服务所需的全部内容。
if (WindowsServiceHelpers.IsWindowsService())
{
    appBuilder.Services.AddSingleton<IHostLifetime, WindowsServiceLifetime>();
    appBuilder.Logging.AddEventLog(settings =>
    {
        if (string.IsNullOrEmpty(settings.SourceName))
        {
            settings.SourceName = appBuilder.Environment.ApplicationName;
        }
    });
}

这对我没有用,因为它没有配置内容根路径。该代码只是 UseWindowsServices 的子集。 - candritzky
@candritzky:在调用WebApplicationBuilder的构造函数时,您可以设置内容根路径。 - Thomas Erdösi
1
@ThomasErdösi,当你说某件事可以做到但在你的示例中没有展示时,请提供一段代码示例。 - James Jensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接