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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:57:02