.NET 6 Preview 7下ASP.NET Core配置Windows服务后访问报404问题
问题原因与解决方法
首先确认:你在builder.Host上调用UseWindowsService()的写法完全正确,这就是ASP.NET Core 6+ 极简模板下的标准调用方式,无需调整位置。你使用的dotnet publish -c Release -r win-x64 --self-contained发布命令也没有问题,无需修改。
你遇到的404问题是Windows服务运行场景下的常见问题,按以下步骤排查修复即可:
1. 修复内容根目录配置
Windows服务启动时默认工作目录为C:\Windows\System32,无法读取你部署目录下的配置文件、静态资源等内容,导致服务配置加载异常。
你需要修改创建WebApplicationBuilder的逻辑,显式设置服务运行场景下的内容根目录:
using Microsoft.OpenApi.Models; using Microsoft.Extensions.Hosting.WindowsServices; // 新增这段代码,替换原来的WebApplication.CreateBuilder(args) var webAppOptions = new WebApplicationOptions { Args = args, // 只有运行在Windows服务场景下才修改根目录,本地调试不受影响 ContentRootPath = WindowsServiceHelpers.IsWindowsService() ? AppContext.BaseDirectory : default }; var builder = WebApplication.CreateBuilder(webAppOptions); builder.Host.UseWindowsService(); // 你原来加的这行保留即可 // 后面的其余代码不需要修改
2. 调整Swagger与环境配置
你当前代码中Swagger相关中间件只在开发环境下启用,Windows服务默认运行在生产环境,直接访问localhost:5000/swagger必然返回404,可按需选择以下方案:
- 若仅临时测试:给Windows服务添加环境变量
ASPNETCORE_ENVIRONMENT=Development,即可保留原有的环境判断逻辑 - 若需要生产环境也能访问Swagger:把Swagger相关的注册与中间件代码移到
if (builder.Environment.IsDevelopment())判断块外面 - 直接访问你编写的业务控制器路由进行测试,比如默认模板的
localhost:5000/WeatherForecast
3. 显式配置监听端口
你可以在部署目录下的appsettings.json中显式指定监听地址,避免端口配置未加载的问题:
{ "Urls": "http://localhost:5000", "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" }
额外注意事项
- 发布后需要把整个
publish目录的所有文件复制到部署路径,不要只单独复制exe文件 - 安装服务时,
binPath参数要填写exe的完整绝对路径 - 若服务启动后仍有异常,可以在Windows事件查看器的「应用程序」日志中查看报错信息,方便定位问题
内容的提问来源于stack exchange,提问作者cvalueapp
相关产品推荐
相关产品推荐

