.NET Core Windows服务经服务管理器启动无法读取appSettings.json
问题根因
Windows服务由服务管理器启动时,系统会将进程默认工作目录设置为C:\Windows\System32,如果代码使用相对路径读取appsettings.json,实际会在system32目录下查找配置文件,自然无法读取到安装目录下的配置,最终所有配置绑定的变量返回空值。
修复方案
根据你的项目实现方式,选对应方案即可:
方案1:使用.NET 通用主机(微软官方推荐的服务构建模式)
如果你是按照官方指南用Microsoft.Extensions.Hosting构建的服务,只需要在配置注册时显式指定内容根路径为程序集实际所在目录即可,不要依赖默认的工作目录。
首先确认你已经安装了Windows服务对应的NuGet包Microsoft.Extensions.Hosting.WindowsServices,然后参考如下代码修改主机构建逻辑:
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Configuration; var builder = Host.CreateDefaultBuilder(args); // 注册Windows服务支持 builder.UseWindowsService(); builder.ConfigureAppConfiguration((hostCtx, configBuilder) => { // 取当前程序集所在目录作为配置文件根路径 var baseDir = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); configBuilder.SetBasePath(baseDir) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{hostCtx.HostingEnvironment.EnvironmentName}.json", optional: true); }); var host = builder.Build(); await host.RunAsync();
方案2:手动构建配置(未使用通用主机)
如果你没有用通用主机模板,手动初始化配置的话,直接抛弃Directory.GetCurrentDirectory()获取路径的写法,通过执行程序集的位置获取安装目录即可:
using System.Reflection; using Microsoft.Extensions.Configuration; // 获取服务实际安装路径 var installDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); IConfiguration config = new ConfigurationBuilder() .SetBasePath(installDir) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); // 配置读取示例 var testVal = config["YourSettingKey"];
注意事项
- 严禁使用
Directory.GetCurrentDirectory()作为配置文件查找的根路径,服务启动场景下该方法返回值始终是系统system32目录 - 不要硬编码服务安装路径,避免后续修改安装位置时配置读取失效
- 项目中要把
appsettings.json文件的复制到输出目录属性设置为「如果较新则复制」或「始终复制」,防止发布时漏带配置文件 - 部署后确认服务运行账号对服务安装目录有读取权限,权限不足也会导致配置文件读取失败
内容的提问来源于stack exchange,提问作者MiguelSlv
相关产品推荐
相关产品推荐

