覆盖Azure配置中的数组

7eumitmz  于 2023-03-24  发布在  其他
关注(0)|答案(1)|浏览(130)

我们有一个托管在Azure中的.NET核心应用程序。appsettings.json中的一些配置在Azure中的app service / configuration / application settings下被覆盖。这对于“平面”属性很好,但不适用于数组(平面值),微软在这里明确记录了这一点(也在this answer中引用)。
例如,对于appsettings中的以下部分:

"Config": {
    "SomeProperty": "Some string value",
    "SomeArray": [
        "Apple",
        "Banana",
        "Orange"
    ]
}

正确设置Config:SomeProperty = new string会更改属性,因此环境变量的设置通常是正确的。我想覆盖azure appsettings中的整个数组Config:SomeArray。以下选项在运行时不会更改数组值的任何内容:
| 关键词|价值|
| - ------|- ------|
| 配置:SomeArray|['NewValue']|
| 配置:SomeArray|[“NewValue”]|
| 配置:SomeArray:0|新值|
最后一个选项来自网络上的多个答案(例如here),其中指出不能覆盖整个数组(子对象),而只能覆盖元素。
是我做错了什么,还是有可能在Azure应用程序设置上更改数组属性?如果没有(或者如果只是元素方面,不知何故),有没有比将其更改为字符串属性并手动解析数组更好的选择(我现在看到的唯一选择,显然是(正确地)dislike的人)?

nzk0hqpo

nzk0hqpo1#

正如您提到的,Azure应用服务配置UI不支持覆盖appsettings.json中的数组值。但是,您可以通过在Azure配置中使用字符串表示数组,然后在.NET代码中解析它以获取数组来解决此限制。
你可以检查下面的方法。
在Azure配置UI中,添加一个新设置,该设置包含键“Config:SomeArray”和表示数组的字符串值,例如“Apple,Banana,橙子”。在.NET代码中,从配置中检索“Config:SomeArray”的值,并将其解析为数组:

"Config": {  
"SomeProperty": "Some string value",  
"SomeArray": "Apple,Banana,Orange"  
}
string containerName = Environment.GetEnvironmentVariable("SomeArray");
 string[] someArray = containerName.Split(',').ToArray();
     foreach (var item in someArray)
      {
          Console.WriteLine(item);
      }

这段代码使用Split()方法将字符串拆分为一个字符串数组,并使用逗号作为分隔符,然后使用ToArray()扩展方法将结果转换为字符串数组。
现在可以在代码中使用解析后的数组:

foreach (string fruit in someArray)
{
    Console.WriteLine(fruit);
}

使用环境变量:将数组定义为环境变量,并在代码中检索它。例如,您可以定义一个名为SOME_ARRAY的环境变量,其值为Apple,Banana,橙子。在代码中,您可以检索此环境变量并将其拆分为数组。
使用Azure Key Vault:将阵列存储在Azure Key Vault中,并在代码中检索它。Azure Key Vault允许您存储和管理机密,如密码、密钥和证书。您可以将阵列作为机密存储在Azure Key Vault中,并在代码中检索它。

更新

应用程序设置“MY_ENV_VAR”的值为包含三个条目的列表:“entry1”、“entry2”和“entry3”。如果您的应用程序需要将此值作为列表使用,则需要首先将其解析为列表数据结构。

string envVarValue = Environment.GetEnvironmentVariable("MY_ENV_VAR");
List<string> myList = new List<string>();

if (!string.IsNullOrEmpty(envVarValue))
{
       string[] entries = envVarValue.Replace("[", "").Replace("]", "").Split(',');
    
    foreach (string entry in entries)
    {
        string trimmedEntry = entry.Trim();
        if (!string.IsNullOrEmpty(trimmedEntry))
        {
            myList.Add(trimmedEntry);
        }
    }
}
foreach (string entry in myList)
{
    Console.WriteLine(entry);
}

相关问题