如何使用.NET Core基于发布配置文件更新appsettings.json?

问题描述 投票:3回答:2

我目前正在从.NET Framework切换到.NET Core。过去,我的所有应用程序设置都在Web.config文件中。当我添加新的发布配置文件时,我可以右键单击并选择“添加配置转换”,这将生成Web.config下的嵌套Web。{Profile} .config文件,我可以在其中设置特定于相应配置文件的应用程序设置。

现在,在.NET Core中,我希望使用appsettings.json文件而不是Web.config文件来实现相同的效果。如何创建appsettings。{Profile} .json文件,它将嵌套在我的appsettings.json文件下并包含特定于我的发布配置文件的设置?当然,我可以手动创建文件,但是什么是“链接”设置,以便在应用程序发布时它们将覆盖appsettings.json?有没有一种简单的方法在Visual Studio中执行此操作,就像我为旧的.NET Framework项目所描述的那样?或者我错过了什么?

谢谢!

visual-studio asp.net-core .net-core asp.net-core-mvc appsettings
2个回答
4
投票

但是什么是“链接”设置,以便在应用程序发布时它们将覆盖appsettings.json?

appsettings由WebHostProgram.cs配置

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();

webhost.cs的实现中,框架将appsettings添加到webhost:

config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

第二行是添加特定环境appsettings的地方。在Visual Studio中,此环境变量在Project Settings -> Debug页面中定义,称为ASPNETCORE_ENVIRONMENT。默认情况下,它设置为Development,因此当您在Visual Studio中构建并运行时,appsettings.development.json文件(如果存在)将被加载并覆盖appsettings.json文件中的任何匹配设置。

发布应用程序时,可以使用同名的OS环境变量覆盖此值。 .NET Core从中读取值的层次结构具有“最后一个赢”策略。

层次结构目前是:

  1. 文件(appsettings.json,appsettings。{Environment} .json,其中{Environment}是应用程序的当前托管环境)
  2. Azure Key Vault
  3. 用户机密(秘密管理员)(仅限开发环境)
  4. 环境变量
  5. 命令行参数

因此,在发布应用程序时,您可以使用环境变量覆盖主机操作系统上的环境。当.NET Core启动您发布的应用程序时,它将读取该变量并加载相应的appsettings。{environment} .json文件。如果未设置该值,或者该环境不存在任何文件,则appsettings.json中的设置将适用。

你可以阅读更多关于ASPNETCORE_ENVIROMENT设置here的信息


2
投票

...从我最初的评论开始,我发现VS 2017和MS Build for .NET Core完全支持web.config转换,一旦你意识到嵌套和转换构建命令不需要成为该项目不再。不要再使用web.config上的“添加配置转换”命令,除非您找到不损坏项目文件的修复程序。只需手动添加web.config的转换版本,它们就会自动嵌套并在发布时运行。是的VS 2017!

您的web.Release.config中的以下内容非常适合设置您的环境变量。

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <location>
    <system.webServer>
      <aspNetCore>
        <environmentVariables>
          <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" xdt:Locator="Match(name)" xdt:Transform="SetAttributes" />
        </environmentVariables>
      </aspNetCore>
    </system.webServer>
  </location>
</configuration>

此外,使用.NET Core 2.2,您不再需要将其他appsettings转换(关闭环境变量)添加到Startup类。这默认......

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

...自动处理接受的答案代码。

最重要的是,作为一个毫无歉意的微软开发人员,我仍然想要假设我的应用程序只会使用MS Build和Web Deploy发布到IIS服务器,我希望能够通过应用程序自己的配置来配置我的应用程序;我希望能够在Build上执行此操作,而不是作为发布或发布后命令行命令。如果微软或某人为Visual Studio创建了一个简单的构建插件,它将转换我的appsettings.json文件,所以我只发布给定环境所需的内容,我很乐意使用它,但是我没有找到它,或者有是时候写一个了。

所以我确保直接回答OP的问题:AppSettings可以很容易地从web.config转移到appsettings.json,并且可能应该,只要您了解所有appsettings.json文件已发布,并在运行时确定-time,与真正的转换解决方案不同,根据请求的配置文件,只发布必要的文件和设置。仅使用web.config转换来设置必要的环境变量,以确定要使用哪个appsettings。{env} .json文件。同样,如果我们可以将我们的apsettings.json文件转换为我们的web.config,就像OP请求的那样,整个讨论就像Dodo一样。我觉得有一天它会来,如果它还没有。

是的,从旧版.NET Framework迁移到.NET Core可能是一项有趣的练习。 .NET Core是向前迈出的一大步,但是有一些障碍可以克服;特别是那些从一开始就留下遗产的人。

© www.soinside.com 2019 - 2024. All rights reserved.