.NET 6.0 Windows服务从system32查找appsettings.json问题排查
问题原因
Windows服务由系统服务控制管理器启动时,默认工作目录为C:\Windows\System32。你当前代码的配置顺序有误:先调用UseWindowsService()再修改配置基础路径,导致你设置的AppContext.BaseDirectory被默认的工作目录配置覆盖,程序最终从system32目录查找appsettings.json,因此只有手动把文件放到system32时服务才能正常运行。
双击exe运行正常是因为手动启动程序时,默认工作目录就是exe所在的目录,程序可以直接找到同目录下的配置文件。
修复步骤
- 调整代码配置顺序,先配置应用基础路径与配置文件加载规则,再调用
UseWindowsService(),避免自定义配置被默认逻辑覆盖。同时建议将配置文件的optional参数改为false,启动时找不到配置直接抛出明确异常,方便排查问题,避免静默加载失败。
修正后的Program.cs代码:
IHost host = Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration(configurationBuilder => { configurationBuilder.SetBasePath(AppContext.BaseDirectory) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); }) .UseWindowsService() .ConfigureServices(services => { services.AddHostedService<Worker>(); }) .Build(); await host.RunAsync();
- 如果你使用的是6.0及以上版本的
Microsoft.Extensions.Hosting.WindowsServices包,也可以直接在UseWindowsService中显式指定内容根路径,彻底规避工作目录导致的路径问题:
IHost host = Host.CreateDefaultBuilder(args) .UseWindowsService(options => { options.ContentRootPath = AppContext.BaseDirectory; }) .ConfigureAppConfiguration(configurationBuilder => { configurationBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); }) .ConfigureServices(services => { services.AddHostedService<Worker>(); }) .Build(); await host.RunAsync();
- 部署前检查项目配置:右键点击项目中的
appsettings.json文件,选择属性,将复制到输出目录选项设置为如果较新则复制或始终复制,避免发布服务时漏带配置文件。
内容的提问来源于stack exchange,提问作者Mario Martinazzi
相关产品推荐
相关产品推荐

