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

时间:2018-11-16 01:58:11

标签: visual-studio asp.net-core .net-core asp.net-core-mvc appsettings

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

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

谢谢!

3 个答案:

答案 0 :(得分:4)

  

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

应用设置由WebHost中的Program.cs配置

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

webhost.cs的实现中,框架将应用程序设置添加到虚拟主机:

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文件中的所有匹配设置。 / p>

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

层次结构当前为:

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

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

您可以详细了解ASPNETCORE_ENVIROMENT设置here

答案 1 :(得分:1)

...并且由于我的原始评论,自那以后,我发现VS 2017和.NET Core的MS Build完全支持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;
    }

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

最重要的是,作为一名无歉的Microsoft开发人员,我仍然希望使用MS Build和Web Deploy将我的应用程序仅发布到IIS服务器,并且我希望能够通过以下方式配置我的应用程序应用程序自己的配置;而且我希望能够在Build上做到这一点,而不是作为发布或发布后的命令行命令。如果Microsoft或某人为Visual Studio创建了一个简单的构建插件,该插件将转换我的appsettings.json文件,那么我只发布给定环境所需的内容,那么我会很乐意使用它,但是我还没有找到它,或者没有该写一个了。

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

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

答案 2 :(得分:0)

这是一个丑陋的解决方法:

在 Azure 构建管道中,构建 ASP.NET 核心项目后,将 appsettings.Production.json 文件复制到工件文件夹中的单独文件夹中。 在发布管道中,使用“替换令牌”任务将 json 文件中的令牌替换为发布变量。 将应用程序部署到 IIS 后,将“转换后的”appsettings.Production.json 复制到网站文件夹。

它有效...