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

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

部署ASP.NET Core应用程序时是否可以更改环境设置(例如使用调试/发布版本的配置文件转换)?

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

最佳答案

中央配置文件是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" : "..."
         }
    }
}

并想通过环境变量覆盖它,您将设置一个名为“Data:Default:ConnectionString”的环境变量,其值将覆盖appsettings.config和appsettings.Production.config中的设置(假设.AddEnvironmentalVariables()称为 .AddJsonFile()之后-使用匹配关键字的最后一次注册获胜),并带有环境变量中的值。

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

更新

由于在评论中有人将其理解为设置环境的唯一方法,因此设置环境变量的方法有很多(大部分记录在Use multiple environments in ASP.NET Core中),所有这些最终都归结为一个环境变量,只是在不同的范围内:
  • 环境变量(全局上,在Windows PowerShell上为Windows cmd.exe set ASPNETCORE_ENVIRONMENT=Development$Env:ASPNETCORE_ENVIRONMENT = "Development",在Linux上为export ASPNETCORE_ENVIRONMENT = Development)
  • 每个命令环境变量(即linux:ASPNETCORE_ENVIRONMENT=Production dotnet MyApp.dll)
  • 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对其进行设置(请参阅here)
  • 在Linux上通过服务定义文件(请参阅docs)
  • 可通过环境变量设置Azure应用服务,可以为每个插槽设置,并具有不同的插槽用于暂存,开发,生产和即部署到暂存,进行预热并与Production
  • 进行交换
  • 通过dotnet run --launch-profile Development每次执行

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

    关于asp.net-core - 部署asp.net核心应用程序时如何处理环境差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37873964/

    相关文章:

    c# - 无法跟踪实体类型 'xTestType' 的实例,因为已跟踪具有相同键的该类型的另一个实例?

    c# - 在 ASP.NET5 控制台应用程序中使用 Startup 类

    java - 使用 Docker 从 Java 调用 .NET Core

    c# - 如何在 ASP.NET Core 中默认添加 URL 参数

    asp.net - 无论行已加载到 EF 更改跟踪器中还是未加载到 Entity Framework 中,如何更新实体?

    c# - Razor Pages OnPost 方法中的 Page() 方法有什么作用?

    c# - 在 ConfigureServices() 中添加 AddMvc() 服务两次是 Asp.Net Core 中的一个好习惯吗?

    c# - 匿名 JSON 对象集合的单元测试

    npm - 如何从asp.net vnext项目中的wwwroot访问node_modules文件夹

    c# - 无法还原 ASP.NET Core 1.0 RTM 解决方案