ASP.NET Core项目如何基于环境变量控制User Secrets启用状态
实现方案
核心思路
CreateDefaultBuilder默认会在Development环境自动加载User Secrets配置源,只需要在调用它之后执行两步调整即可:
- 移除所有已自动加载的User Secrets配置源
- 自行判断当前运行环境,仅当环境为自定义
Local时重新添加User Secrets配置源
.NET 6+ 版本实现(WebApplication 构建模式)
直接在Program.cs中修改配置逻辑即可:
var builder = WebApplication.CreateBuilder(args); // 移除默认添加的所有User Secrets配置源 builder.Configuration.Sources .Where(s => s is Microsoft.Extensions.Configuration.UserSecrets.UserSecretsConfigurationSource) .ToList() .ForEach(s => builder.Configuration.Sources.Remove(s)); // 仅Local环境启用User Secrets if (builder.Environment.IsEnvironment("Local")) { // 泛型参数填项目内任意类均可,用于定位用户机密对应的程序集 builder.Configuration.AddUserSecrets<Program>(); } // 后续保留你原有其他服务注册、中间件配置逻辑 var app = builder.Build(); // ... 原有逻辑不变
.NET 5及更早版本实现(泛型主机/Startup 模式)
在Program.cs的主机构建逻辑中添加ConfigureAppConfiguration配置段:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { // 移除默认的User Secrets配置源 var userSecretsSources = config.Sources .OfType<Microsoft.Extensions.Configuration.UserSecrets.UserSecretsConfigurationSource>() .ToList(); foreach (var source in userSecretsSources) { config.Sources.Remove(source); } // 仅Local环境添加User Secrets if (context.HostingEnvironment.IsEnvironment("Local")) { config.AddUserSecrets<Startup>(); } }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
注意事项
- 常规ASP.NET Core项目模板默认已安装
Microsoft.Extensions.Configuration.UserSecretsNuGet包,如遇缺失可自行安装 AddUserSecrets<T>的泛型参数仅用于定位程序集的用户机密ID,填写项目内任意自定义类均可- 调整完成后,
Development环境将完全禁用User Secrets,Local环境将保留User Secrets高于环境配置文件的优先级
内容的提问来源于stack exchange,提问作者Carlos Jimenez Bermudez
相关产品推荐
相关产品推荐

