如何在.NET Core MVC项目中转换appsettings.json?

时间:2017-03-28 15:39:46

标签: c# .net json asp.net-mvc asp.net-core

我已将额外的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在同一台计算机上,因此设置手动指定环境的环境变量不是一个选项。

Project Properties : Debug section

5 个答案:

答案 0 :(得分:17)

从构建类型

确定EnvironmentName

对于任何想要根据构建类型设置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

设置不同的环境变量值

这样做的步骤是:

  1. 转到IIS中的应用程序,然后选择Configuration Editor
  2. 选择Configuration Editor
  3. system.webServer/aspNetCore组合框
  4. 中选择system.webServer/httpPlatform(RC2和RTM)或Section(RC1)
  5. Applicationhost.config ...组合框中选择From
  6. 点击enviromentVariables元素并打开编辑窗口。
  7. 设置您的环境变量。
  8. 关闭窗口并单击“应用”。
  9. 完成
  10. 或者,您可以修改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。

如果要切换环境,则需要在启动前设置环境变量。如何做到这一点取决于您的环境。

Windows(命令行,cmd.exe)

setx ASPNETCORE_ENVIRONMENT "Development"

Windows(Powershell)

$Env:ASPNETCORE_ENVIRONMENT = "Development"

的Linux

export ASPNETCORE_ENVIRONMENT="Development"

Linux(将其设置为单个命令)

ASPNETCORE_ENVIRONMENT="Development" dotnet run

有关评论的更新

是的,它是特定于机器的(Linux除外,你可以按命令执行)。但是,在IIS中,您也可以通过不同的应用程序池或按照this answers指令将其添加到IIS

答案 4 :(得分:0)

如果您使用azure将ASPNETCORE_ENVIRONMENT与相应的值添加到webapp一侧的应用程序设置,然后将获取正确的appsettings。{value} .json file