从秘密/环境变量替换 ASP.NET 核心 appsettings.json 中类型化数组的一部分?

get*_*ode 4 .net-core asp.net-core

我们有一个带有这个 appsettings.json 的 ASP.NET Core Web 应用程序:

{
  "Subscriptions": [
    {
      "Name": "Production",
      "PublishSettings": "<PublishData>SECRET</PublishData>",
      "Environments": [
        {
          "Name": "Prod",
          "DeploymentServiceNames": [
            "api1",
            "api2",
            "api3"
          ]
        }
      ]
    },
    {
      "Name": "Test",
      "PublishSettings": "<PublishData>SECRET</PublishData>",
      "Environments": [
        {
          "Name": "Test1",
          "DeploymentServiceNames": [
            "api1",
            "api2"
          ]
        },
        {
          "Name": "Test2",
          "DeploymentServiceNames": [
            "api1",
            "api2"
          ]
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

这些PublishSettings值是秘密的,所以我希望在我的本地用户机密文件和我的部署的环境变量中使用这些值。但是,因为Subscriptions是一个数组,我不确定如何。我不是特别想交换整个Subscriptions部分。有没有办法为这样一个数组中的每个项目交换一个属性,也许是通过在强类型订阅模型上定义一个键属性?

Cod*_*ler 6

当您在 .NET Core 中加载配置时,它在底层表示为一组string由添加的配置提供程序提供的键值对(键和值都有类型)。

例如,appsettings.json将表示JsonConfigurationProvider为以下设置列表:

{Subscriptions:0:Environments:0:DeploymentServiceNames:0, api1}
{Subscriptions:0:Environments:0:DeploymentServiceNames:1, api2}
{Subscriptions:0:Environments:0:DeploymentServiceNames:2, api3}
{Subscriptions:0:Environments:0:Name, Prod}
{Subscriptions:0:Name, Production}
{Subscriptions:0:PublishSettings, <PublishData>SECRET</PublishData>}
{Subscriptions:1:Environments:0:DeploymentServiceNames:0, api1}
{Subscriptions:1:Environments:0:DeploymentServiceNames:1, api2}
{Subscriptions:1:Environments:0:Name, Test1}
{Subscriptions:1:Environments:1:DeploymentServiceNames:0, api1}
{Subscriptions:1:Environments:1:DeploymentServiceNames:1, api2}
{Subscriptions:1:Environments:1:Name, Test2}
{Subscriptions:1:Name, Test}
{Subscriptions:1:PublishSettings, <PublishData>SECRET</PublishData>}
Run Code Online (Sandbox Code Playgroud)

如您所见,JSON 结构被扁平化,并且键是通过将内部部分名称与冒号连接来构建的。数组元素添加适当的索引作为名称。

如果您添加另一个配置源,例如环境变量或另一个秘密 json 文件,它们将具有相同密钥的设置,它将覆盖该设置。

因此,如果您想添加或覆盖PublishSettings,您可以添加另一个 JSON 文件作为配置源:

{
  "Subscriptions": [
    {
      "PublishSettings": "<PublishData>SECRET</PublishData>"
    },
    {
      "PublishSettings": "<PublishData>SECRET</PublishData>"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

或者使用以下键将其添加为环境变量:

Subscriptions:0:PublishSettings
Subscriptions:1:PublishSettings
Run Code Online (Sandbox Code Playgroud)

这种设置覆盖(或添加)对于 .NET Core 配置绑定器是透明的。设置 POCO 将包含PublishSettings来自提供此类值的最后一个配置源的值。