【发布时间】:2018-03-04 00:11:42
【问题描述】:
我在appsettings.json 中为数据库连接字符串、webapi 位置等定义了一些值,这些值对于开发、暂存和实时环境是不同的。
有没有办法拥有多个appsettings.json 文件(如appsettings.live.json 等)并让asp.net 应用程序根据其运行的构建配置“知道”使用哪个文件?
【问题讨论】:
标签: c# asp.net-core appsettings
我在appsettings.json 中为数据库连接字符串、webapi 位置等定义了一些值,这些值对于开发、暂存和实时环境是不同的。
有没有办法拥有多个appsettings.json 文件(如appsettings.live.json 等)并让asp.net 应用程序根据其运行的构建配置“知道”使用哪个文件?
【问题讨论】:
标签: c# asp.net-core appsettings
当我使用没有网页的控制台应用程序时,这是适用于我的版本:
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true);
IConfigurationRoot configuration = builder.Build();
AppSettings appSettings = new AppSettings();
configuration.GetSection("AppSettings").Bind(appSettings);
【讨论】:
.vscode/launch.json 文件仅由 Visual Studio 以及 /Properties/launchSettings.json 文件使用。不要在生产中使用这些文件。
launchSettings.json 文件:
包含配置文件设置。
以使用文件“appSettings.QA.json”为例。您可以使用“ASPNETCORE_ENVIRONMENT”。请按照以下步骤操作。
【讨论】:
您可以使用CreateDefaultBuilder,它会自动构建配置对象并将其传递给您的启动类:
WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
public class Startup
{
public Startup(IConfiguration configuration) // automatically injected
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
/* ... */
}
CreateDefaultBuilder 自动包含适当的 appsettings.<i>Environment</i>.json 文件,因此为每个环境添加单独的 appsettings 文件:
然后在运行/调试时设置ASPNETCORE_ENVIRONMENT环境变量
根据您的 IDE,dotnet 项目通常会在几个地方查找环境变量:
对于 Visual Studio,请转到项目 > 属性 > 调试 > 环境变量:
对于 Visual Studio 代码,编辑 .vscode/launch.json > env:
使用启动设置,编辑Properties/launchSettings.json > environmentVariables:
也可以从 Visual Studio 的工具栏中选择
使用 dotnet CLI,为 setting environment variables per your OS 使用适当的语法
注意:当使用dotnet run 启动应用程序时,会读取
launchSettings.json(如果可用),并且launchSettings.json 中的environmentVariables设置会覆盖环境变量。
Host.CreateDefaultBuilder 是如何工作的?.NET Core 3.0 在平台扩展下添加了Host.CreateDefaultBuilder,它将提供IConfiguration 的默认初始化,它按以下顺序为应用提供默认配置:
appsettings.json使用 JSON configuration provider。appsettings.<i>Environment</i>.json使用 JSON configuration provider。例如:
appsettings.<i>Production</i>.json或appsettings.<i>Development</i>.json- App secrets 当应用在开发环境中运行时。
- 环境变量使用Environment Variables configuration provider。
- 命令行参数使用Command-line configuration provider。
【讨论】:
在 ASP.NET Core 中,您应该使用环境变量而不是构建配置以获得正确的 appsettings.json
右键单击您的项目>属性>调试>环境变量
ASP.NET Core 将使用适当的 appsettings.json 文件:
现在您可以像这样使用该环境变量:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
注意:如果您使用@Dmitry's answer,您可能会遇到问题,例如。 在 Azure 上覆盖 appsettings.json 值时。
【讨论】:
我添加了工作环境的屏幕截图,因为它花费了我几个小时的研发时间。
首先,在您的launch.json 文件中添加一个密钥。
请看下面的截图,我已经添加了 Development 作为我的环境。
然后,在您的项目中,创建一个包含环境名称的新 appsettings.{environment}.json 文件。
在以下屏幕截图中,查找两个具有不同名称的文件:
appsettings.Development.JsonappSetting.json最后,将它配置到您的 StartUp 类中,如下所示:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
最后,你可以像这样从命令行运行它:
dotnet run --environment "Development"
其中 "Development" 是我的环境的名称。
【讨论】:
IWebHostEnvironment。
创建多个appSettings.<i>$(Configuration)</i>.json 文件,例如:
appSettings.staging.jsonappSettings.production.json在项目上创建一个预构建事件,将相应的文件复制到appSettings.json:
copy appSettings.$(Configuration).json appSettings.json
在您的配置生成器中仅使用 appSettings.json:
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
【讨论】:
Properties,然后在属性视图中选择 Build Events。
您可以在launchSettings.json 中添加配置名称为ASPNETCORE_ENVIRONMENT,如下所示
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:58446/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"environmentVariables": {
ASPNETCORE_ENVIRONMENT": "$(Configuration)"
}
}
}
【讨论】:
你可以使用条件编译:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
#if SOME_BUILD_FLAG_A
.AddJsonFile($"appsettings.flag_a.json", optional: true)
#else
.AddJsonFile($"appsettings.no_flag_a.json", optional: true)
#endif
.AddEnvironmentVariables();
this.configuration = builder.Build();
}
【讨论】:
只是针对.NET core 2.0用户的更新,可以在调用CreateDefaultBuilder后指定应用配置:
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(ConfigConfiguration)
.UseStartup<Startup>()
.Build();
static void ConfigConfiguration(WebHostBuilderContext ctx, IConfigurationBuilder config)
{
config.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json", optional: false, reloadOnChange: true)
.AddJsonFile($"config.{ctx.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);
}
}
【讨论】:
ASPNETCORE_ENVIRONMENT 的当前环境。该值将替换为ctx.HostingEnvironment.EnvironmentName}。因此,如果您在属性中将该值设置为“生产”,项目将在根文件夹中查找config.Production.json 文件。欲了解更多信息,请查看此link
Error CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?)
您可以像这样在Startup 构造函数中使用环境变量和ConfigurationBuilder 类:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
this.configuration = builder.Build();
}
然后您为您需要的每个环境创建一个appsettings.xxx.json 文件,其中“xxx”是环境名称。请注意,您可以将所有全局配置值放入“普通”appsettings.json 文件中,并且仅将环境特定的内容放入这些新文件中。
现在您只需要一个名为ASPNETCORE_ENVIRONMENT 的环境变量,并带有一些特定的环境值(“live”、“staging”、“production”等)。您可以在开发环境的项目设置中指定此变量,当然您还需要在暂存和生产环境中进行设置。你在那里做的方式取决于这是什么样的环境。
更新:我刚刚意识到您想根据您当前的构建配置选择appsettings.xxx.json。我提出的解决方案无法实现这一点,我不知道是否有办法做到这一点。然而,“环境变量”方式是可行的,并且可能是您的方法的一个很好的替代方案。
【讨论】: