我已经appsettings.json
为诸如数据库连接字符串,webapi位置之类的东西定义了一些值,这些值对于开发,暂存和实时环境是不同的。
有没有一种方法可以拥有多个appsettings.json
文件(如appsettings.live.json
,等),并让asp.net应用程序根据运行的构建配置“知道”要使用哪个文件?
Answers:
您可以使用条件编译:
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();
}
我添加了一个工作环境的屏幕快照,因为它花费了我几个小时的研发时间。
首先,向launch.json
文件添加密钥。
请参阅以下屏幕截图,我已将其添加Development
为我的环境。
然后,在您的项目中,创建一个appsettings.{environment}.json
包含环境名称的新文件。
在下面的屏幕快照中,查找两个不同名称的文件:
appsettings.Development.Json
appSetting.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
改用。
您可以使用CreateDefaultBuilder
which将自动生成配置对象并将其传递给启动类:
WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
public class Startup
{
public Startup(IConfiguration configuration) // automatically injected
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
/* ... */
}
CreateDefaultBuilder
自动包含适当的文件,因此为每个环境添加一个单独的appsettings文件:appsettings.Environment.json
然后在运行/调试时设置ASPNETCORE_ENVIRONMENT
环境变量
根据您的IDE,在传统上,dotnet项目有两个地方寻找环境变量:
对于Visual Studio,请转到“项目”>“属性”>“调试”>“环境变量”:
对于Visual Studio Code,请编辑.vscode/launch.json
> env
:
使用启动设置,编辑Properties/launchSettings.json
> environmentVariables
:
也可以从Visual Studio的工具栏中选择
使用dotnet CLI,使用适当的语法为每个OS设置环境变量
注意:使用dotnet run启动应用程序时,
launchSettings.json
将读取(如果可用),并且environmentVariables
launchSettings.json中的设置将覆盖环境变量。
Host.CreateDefaultBuilder
工作如何?Host.CreateDefaultBuilder
在平台扩展下添加了.NET Core 3.0 ,它将提供默认的初始化,IConfiguration
并按以下顺序为应用提供默认配置:
appsettings.json
使用JSON配置提供程序。appsettings.Environment.json
使用JSON配置提供程序。例如:
appsettings.Production.json
要么appsettings.Development.json
- 应用在开发环境中运行时的秘密。
- 使用环境变量配置提供程序的环境变量。
- 使用命令行配置提供程序的命令行参数。
在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的答案,则可能会遇到问题。当在Azure上覆盖appsettings.json值。
您可以使用环境变量和的ConfigurationBuilder
在类Startup
的构造函数是这样的:
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
带有某些特定环境值(“实时”,“分段”,“生产”等等)的环境变量即可。您可以在开发环境的项目设置中指定此变量,当然,还需要在暂存和生产环境中进行设置。在此操作的方式取决于所处的环境。
更新:我刚刚意识到您想appsettings.xxx.json
根据当前的构建配置选择。用我提出的解决方案无法实现这一点,我不知道是否有办法做到这一点。但是,“环境变量”方式有效,并且可能是您的方法的一个很好的替代方法。
只是.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}
。因此,如果您在属性中将该值设置为“ Production”,则项目将config.Production.json
在根文件夹中查找文件。有关更多信息,请查看此链接
Error CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?)
在WebHost.CreateDefaultBuiler(...中创建一个
创建多个文件,例如:appSettings.$(Configuration).json
appSettings.staging.json
appSettings.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();
您可以添加配置名称作为ASPNETCORE_ENVIRONMENT
在launchSettings.json
如下
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:58446/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"environmentVariables": {
ASPNETCORE_ENVIRONMENT": "$(Configuration)"
}
}
}
当使用不带网页的控制台应用程序时,此版本对我有效:
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”。请按照以下步骤操作。