.Net Core 3.1控制台/Worker服务如何读取环境名加载对应appsettings配置
解决方案
核心问题原因
- 你单独初始化的
ConfigurationBuilder没有传递给HostBuilder,服务运行时用的还是Host.CreateDefaultBuilder默认的配置加载逻辑,你自定义的配置规则完全没生效 - Windows服务运行时默认使用系统服务账号,若配置的是当前用户的环境变量会无法读取,且环境变量修改后需要重启系统才能被服务识别
- 你提供的代码片段存在语法错误:
ConfigureServices中未定义serviceProvider就直接调用,会导致编译失败
修复步骤
1. 重构配置加载逻辑
将自定义配置规则直接写入HostBuilder的ConfigureAppConfiguration方法中,和宿主环境绑定,代码修改如下:
public static string CURRENT_DIR = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) { return Host.CreateDefaultBuilder(args) .UseWindowsService() // 显式覆盖配置加载规则 .ConfigureAppConfiguration((hostContext, configBuilder) => { configBuilder.SetBasePath(CURRENT_DIR) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); }) .ConfigureServices((hostContext, services) => { IConfiguration Configuration = hostContext.Configuration; services.AddOptions(); services.Configure<AppOptions>(Configuration.GetSection("AppOptions")); services.AddHttpContextAccessor(); services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); }) // 日志配置移到此处更规范 .ConfigureLogging((hostContext, loggingBuilder) => { var env = hostContext.HostingEnvironment; // 放入你原有的ConfigureLogging逻辑 }); }
2. 修正环境变量配置
- 打开Windows系统环境变量配置,将
ASPNETCORE_ENVIRONMENT添加到系统变量而非用户变量中,值设为SIT - 配置完成后重启服务器(Windows服务控制管理器会在系统启动时缓存环境变量,仅重启服务不会生效)
3. 备选发布方案(无需修改服务器环境变量)
如果不想修改服务器系统环境变量,发布时直接指定环境名即可,会自动写入运行时配置文件:
- 执行发布命令:
dotnet publish /p:Configuration=Release /p:EnvironmentName=SIT
- 或在项目
.csproj文件中添加配置:
<PropertyGroup Condition="'$(Configuration)' == 'Release'"> <EnvironmentName>SIT</EnvironmentName> </PropertyGroup>
4. 检查配置文件属性
确保项目中appsettings.SIT.json的复制到输出目录属性设置为如果较新则复制,避免发布时文件未被打包到输出目录。
内容的提问来源于stack exchange,提问作者ajay dhamnikar
相关产品推荐
相关产品推荐

