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

10

在部署ASP.NET Core应用程序时,是否有一种更改环境设置的方法(例如使用调试/发布构建进行配置文件转换)?

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

2个回答

26

中央配置文件是 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();
你只需要设置环境类型的环境变量即可使其运行(有关文档请参见此处)。
如果将AddEnvironmentVariables()添加到配置生成器中,您还可以具有覆盖效果的环境变量。因此,如果您有一个名为 appsettings.json 的文件,则它可以被覆盖。
{
    "Data"  {
         "Default" {
              "ConnectionString" : "..."
         }
    }
}
如果您想通过环境变量覆盖该设置,可以设置一个名为 "Data:Default:ConnectionString" 的环境变量,并且它的值将覆盖 appsettings.config 和 appsettings.Production.config 中的设置(假设在调用 .AddEnvironmentalVariables() 之后调用 .AddJsonFile() - 最后一个具有匹配键的注册获胜),该方法并不是唯一设置环境变量的方式,可以参考官方文档here 或者 Use multiple environments in ASP.NET Core

  1. 全局环境变量(例如Windows cmd.exe上的set ASPNETCORE_ENVIRONMENT=Development或powershell上的$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
  • 通过命令行创建Docker容器 docker run -e ASPNETCORE_ENVIRONMENT=Debugging
  • 通过web.config在IIS中配置。

  • <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" forwardWindowsAuthToken="false" stdoutLogEnabled="true" >
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
    
  • 在IIS中,可以按AppPool设置它(请参见此处)。
  • 在Linux上,可以通过服务定义文件设置它(请参见文档)。
  • Azure App Service通过环境变量进行设置,可以按插槽设置,并为暂存、开发、生产等不同的插槽设置不同的值。例如,在部署到暂存中、预热并与生产环境交换之前设置。
  • 通过dotnet run --launch-profile Development进行每次执行时的设置。
  • 它们都可以在特定的范围内(全局、容器内部、应用程序池内部、每次执行等)更改/设置环境变量。选择适合您需求的方法。


    1
    简单地设置变量。在Windows上,使用setx Hosting:Environment Staging或在Linux上使用export Hosting__Environment=Staging(注意双下划线!)。在构建配置时确保有AddEnvironmentVariables()调用,否则它将无效。 - Tseng
    1
    如何使用ASP.NET Core运行多个环境。官方文档中没有提到“setx”命令。 - Soma Yarlagadda
    3
    阅读链接的文章,上面已经阐述了!__此文件保存了特定于每个Visual Studio配置用于启动应用程序的配置文件的设置,包括应使用哪些环境变量。__仅在您按下F5键以启动/调试应用程序时,在Visual Studio内部使用它。对于生产环境,您需要使用真实的环境变量。 - Tseng
    1
    @序列化:问题在哪里?你可以在每次执行时设置变量(至少在Linux上),你可以将它放入与其他应用程序隔离的Docker容器中,你可以在IIS中或全局为整个机器设置变量,在Azure中,每个VM插槽(暂存,生产等)都可以拥有自己的变量,并且在2.0中也可以使用dotnet run --launch-profile Development。这里没有看到任何问题。 - Tseng
    显示剩余17条评论

    0

    使用额外的appsettings.*.json文件是一个不错的选择。*片段可以用于混合任何唯一的环境属性,以区分机器、用户或部署方案。

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

        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 文件名。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接