部署asp.net核心应用程序时如何处理环境差异?

时间:2016-06-17 05:44:22

标签: asp.net-core asp.net-core-mvc asp.net-core-1.0

有没有办法在部署ASP.NET Core应用程序时更改环境设置(比如使用调试/发布版本进行配置文件转换)?

在.NET Core应用程序中维护多个环境设置的最佳方法是什么(类似于本地,分段和生产的<appSettings file="local.config">)?

2 个答案:

答案 0 :(得分:18)

中央配置文件是appsettings.json,您可以拥有多个文件,例如appsettings.Production.json等,这些文件将被加载并覆盖appsettings.json的设置。

例如

        // Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .SetBasePath(hostEnv.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{hostEnv.EnvironmentName}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();

要使其工作,您需要的是用于设置环境类型的环境变量(请参阅文档here)。

如果将AddEnvironmentVariables()添加到配置构建器,也可以使用覆盖的环境变量。所以如果你有一个appsettings.json

{
    "Data"  {
         "Default" {
              "ConnectionString" : "..."
         }
    }
}

并希望通过环境变量覆盖它,您需要设置一个名为&#34; Data:Default:ConnectionString&#34;的环境变量。并且它的值将覆盖appsettings.config和appsettings.Production.config中的设置(假设您的.AddEnvironmentalVariables().AddJsonFile()后被称为 - 最后一次注册匹配键获胜)与环境变量的值。

您可以在官方文档here中找到更多信息。

更新

由于在评论中有些人认为这是设置环境的唯一方法,因此有很多方法可以设置环境变量(大部分都记录在Use multiple environments in ASP.NET Core中),所有这些最终都归结为环境变量,只是在不同的范围内:

  1. 环境变量(全局,PowerShell上的Windows cmd.exe set ASPNETCORE_ENVIRONMENT=Development$Env:ASPNETCORE_ENVIRONMENT = "Development",Linux上的export ASPNETCORE_ENVIRONMENT = Development
  2. 每个命令环境变量(即linux:ASPNETCORE_ENVIRONMENT=Production dotnet MyApp.dll
  3. Docker容器,即通过docker-compose.yaml

    web:
        environment:
        - ASPNETCORE_ENVIRONMENT=Debugging
    
  4. Docker容器通过命令行docker run -e ASPNETCORE_ENVIRONMENT=Debugging
  5. 通过web.config在IIS中
  6. <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" forwardWindowsAuthToken="false" stdoutLogEnabled="true" >
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
    
  7. 在IIS上按AppPool设置(请参阅here
  8. 在Linux上通过服务定义文件(参见docs
  9. Azure App Service via Environment变量,可以按插槽设置,并具有不同的插槽,用于分段,开发,生产,即部署到分段,进行预热和交换生产
  10. 通过dotnet run --launch-profile Development
  11. 执行

    它们都在特定范围内更改/设置环境变量(全局,本地到容器,在应用程序池内,每次执行等)。选择一个适合您需求的产品。

答案 1 :(得分:0)

使用其他appsettings.*.json文件是一个很好的方法。 *片段可用于混合任何可区分机器,用户或部署方案的独特环境属性。

但是,我建议您使用另一种方法,而不是使用new ConfigurationBuilder()从头开始构建配置对象(如Web上许多资料所示)。以下代码不会替换您现有的配置,而是添加到其中:

    public IHostingEnvironment _environment { get; }
    public IConfiguration _configuration { get; }

    public Startup(IConfiguration configuration, IHostingEnvironment environment)
    {
        _environment = environment;

        // use the default config and add config from appsettings.COMPUTERNAME.json (if it exists)
        var builder = new ConfigurationBuilder()
            .SetBasePath(environment.ContentRootPath)
            .AddConfiguration(configuration)
            .AddJsonFile($"appsettings.{System.Environment.GetEnvironmentVariable("COMPUTERNAME")}.json", optional: true);
        _configuration = builder.Build();

    }

背景

当您基于dotnet new模板创建项目时,您的项目已经带有一个有用的配置,该配置通过CreateDefaultBuilder()方法自动构建。此默认配置结合了来自多个来源的信息:appsettings.json,appsettings。{Environment} .json,Secret Manager,环境变量和命令行参数。

如果您自己完全重建配置,则将失去所有魔力。

提示:

在上面的示例中,appsettings.COMPUTERNAME.json仅是示例。您可以根据_environmentSystem.Environment中的任何可清楚地区分不同开发和部署方案的数据来组成自己的json文件名。