You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:06:19