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

Mat*_*hew 7 appsettings visual-studio asp.net-core-mvc .net-core asp.net-core

我目前正在从.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中有一种简单的方法?还是我错过了什么?

谢谢!

iGa*_*nja 6

...自从我最初发表评论以来,我发现 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>
Run Code Online (Sandbox Code Playgroud)

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

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

是的,从旧版 .NET Framework 迁移到 .NET Core 是一项有趣的练习。.NET Core 向前迈进了一大步,但仍有一些障碍需要克服;特别是对于那些从一开始就继承遗产的人。


Sim*_*Ged 5

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

所述的AppSettings由配置WebHostProgram.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();
Run Code Online (Sandbox Code Playgroud)

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

config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
Run Code Online (Sandbox Code Playgroud)

第二行是添加特定于环境的位置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密钥保管库
  3. 用户机密(秘密管理器)(仅在开发环境中)
  4. 环境变量
  5. 命令行参数

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

您可以在此处详细了解ASPNETCORE_ENVIROMENT设置

  • 这很棒,我认为是正确的,但并没有真正回答如何替换 web.config 转换的问题。如果我的开发环境和多个测试环境都存在于同一台机器上怎么办?如何为每个主机拥有唯一的操作系统级别环境变量?我真的很想要一个实际的转换解决方案,它适用于构建(或发布)而不是运行时。 (3认同)