我已将额外的json配置文件添加到我的项目
appsettings.DEV.json
appsettings.QA.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, reloadOnChange: true);
...
我了解如何更改环境:修改项目属性中ASPNETCORE_ENVIRONMENT
环境变量的值。但是,似乎没有能力根据配置指定不同的环境变量,下拉列表标记为“N / A”并禁用。
我看到的唯一选择是手动更改环境变量值,以更改使用的appsettings。我确信有一种方法可以自动完成,或者你会如何使用CI? (除了使用脚本来更改环境变量之外,还有一种更简单的方法)。
此处的目标是为三种环境设置自动构建和持续集成:DEV,QA和PROD。 DEV和QA在同一台计算机上,因此设置手动指定环境的环境变量不是一个选项。
答案 0 :(得分:17)
对于任何想要根据构建类型设置EnvironmentName的人,.UseEnvironment(environmentName)
上有一个方便的WebHostBuilder
(可在Program Main中找到)。
只要针对项目中的构建配置设置了适当的编译符号,就可以执行以下操作来确定EnvironmentName:
public static void Main(string[] args)
{
string environmentName;
#if DEBUG
environmentName = "Development";
#elif STAGING
environmentName = "Staging";
#elif RELEASE
environmentName = "Production";
#endif
var host = new WebHostBuilder()
.UseKestrel()
.UseEnvironment(environmentName)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run();
}
答案 1 :(得分:10)
我已经找到了Tsengs回答的解决方案,但为了清楚起见,希望在此处对其进行描述。 解决方案可以在另一个问题的答案中找到,但问题是完全不同的(我也扩展了答案)所以我不认为这个问题应该被标记为重复。
答案是here
解决方案是在每个IIS站点上为密钥ASPNETCORE_ENVIRONMENT
这样做的步骤是:
Configuration Editor
。Configuration Editor
system.webServer/aspNetCore
组合框system.webServer/httpPlatform
(RC2和RTM)或Section
(RC1)
Applicationhost.config ...
组合框中选择From
。enviromentVariables
元素并打开编辑窗口。或者,您可以修改applicationHost.config
文件(通常位于C:\Windows\System32\inetsrv\config\applicationHost.config
在根<Configuration>
标记下添加以下条目,其中“my-iis-site”是IIS网站的名称。
<location path="my-iis-site">
<system.webServer>
<aspNetCore>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="DEV" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
答案 2 :(得分:7)
如果您使用program.cs中的默认代码,除了在项目中创建两个文件之外,您不需要做任何事情。
program.cs
中的默认代码如下所示:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
code实际上在做什么:
public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
var builder = new WebHostBuilder();
...
builder.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
...
return builder;
}
所以,你所要做的就是创建appsettings.YourEnvionronmentalVariable.json
,它会
自动变换。
附加说明:要使两个文件实际合并,请使用以下语法:
var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
不
var appSettings = new AppSettings();
Configuration.Bind("AppSettings", appSettings);
return appSettings;
后者不会返回合并后的数据。
感谢Shawn Wildermuth this
答案 3 :(得分:1)
您在图片中链接的对话框仅用于配置“launchSettings.json”。此文件未被您的应用程序使用。
当您点击F5并且无时,Visual Studio仅使用它来设置环境并在浏览器中打开URL。
如果要切换环境,则需要在启动前设置环境变量。如何做到这一点取决于您的环境。
setx ASPNETCORE_ENVIRONMENT "Development"
$Env:ASPNETCORE_ENVIRONMENT = "Development"
export ASPNETCORE_ENVIRONMENT="Development"
ASPNETCORE_ENVIRONMENT="Development" dotnet run
是的,它是特定于机器的(Linux除外,你可以按命令执行)。但是,在IIS中,您也可以通过不同的应用程序池或按照this answers指令将其添加到IIS
。答案 4 :(得分:0)
如果您使用azure将ASPNETCORE_ENVIRONMENT与相应的值添加到webapp一侧的应用程序设置,然后将获取正确的appsettings。{value} .json file