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

Jam*_*zba 18 .net c# asp.net-mvc json asp.net-core

我已经为我的项目添加了额外的json配置文件

appsettings.DEV.json
appsettings.QA.json
Run Code Online (Sandbox Code Playgroud)

并将它们加载到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);
    ...
Run Code Online (Sandbox Code Playgroud)

我了解如何更改环境:修改ASPNETCORE_ENVIRONMENT项目属性中环境变量的值.但是,似乎没有能力根据配置指定不同的环境变量,下拉列表标记为"N/A"并禁用.

我看到的唯一选择是手动更改环境变量值,以更改使用的appsettings.我确信有一种方法可以自动完成,或者你会如何使用CI?(除了使用脚本来更改环境变量之外,还必须有一种更简单的方法).

这里的目标是为三个环境设置自动构建和持续集成:DEV,QA和PROD. DEV和QA位于同一台计算机上,因此无法手动设置指定环境的环境变量.

项目属性:调试部分

Car*_*man 18

从构建类型确定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();
}
Run Code Online (Sandbox Code Playgroud)

  • 什么是“#if DEBUG”? (2认同)
  • @Toolkit #if 是预处理器指令:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-if。DEBUG 是一个预定义的预处理器符号,在项目中选中“定义 DEBUG 常量”时设置。 (2认同)

Jam*_*zba 11

我已经从Tsengs的答案中找到了解决方案,但是为了清楚起见,希望在此处对其进行描述.解决方案可以在另一个问题的答案中找到,但问题是完全不同的(我也扩展了答案)所以我不认为这个问题应该被标记为重复.

答案就在这里

解决方案是在每个IIS站点上为密钥设置不同的环境变量值 ASPNETCORE_ENVIRONMENT

这样做的步骤是:

  1. 转到IIS中的应用程序并选择Configuration Editor.
  2. 选择 Configuration Editor
  3. 在组合框中选择system.webServer/aspNetCore(RC2和RTM)或system.webServer/httpPlatform(RC1)Section
  4. 选择Applicationhost.config ...From组合框中.
  5. 单击enviromentVariables元素并打开编辑窗口.
  6. 设置环境变量.
  7. 关闭窗口,然后单击"应用".
  8. 完成

或者,您可以修改您的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>
Run Code Online (Sandbox Code Playgroud)


Gre*_*Gum 11

如果您使用program.cs中的默认代码,则除了在项目中创建两个文件之外,您不需要执行任何操作.

默认代码Program.cs如下所示:

public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
Run Code Online (Sandbox Code Playgroud)

以下是代码实际执行的操作:

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;
}
Run Code Online (Sandbox Code Playgroud)

所以,你所要做的就是创建它Program.cs,它会自动转换.

附加说明:要使两个文件实际合并,请使用以下语法:

env.EnvironmentName

不:

var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
Run Code Online (Sandbox Code Playgroud)

后者不会返回合并的数据.

感谢Shawn Wildermuth为

  • 在我看来,环境变量就是这样-一个变量,并且它有太多改变或无法发布的方式。在生产环境中,这似乎让我有些恐惧。但这只是我个人的喜好。 (2认同)