在Azure Web应用程序设置中使用数组

69

在我的ASP.NET 5(RC1)代码中,我有一个类似于以下内容的appsetting.json:

{
    "SomeSettings": {
        "PropA": "ValueA",
        "PropB": [
            "ValueB1",
            "ValueB2"
        ]
    }
}

这些值用于在我的开发机(即本地主机)上运行代码。如果我想要覆盖Azure Web应用程序的应用程序设置中的"SomeSettings",我应该如何指定"PropB"数组?

我想存储信息的SomeSettings.cs类看起来像这样:

public class SomeSettings
{
    public string PropA { get; set; }
    public List<string> PropB { get; set; }
}
问题是“PropB” - 如何在Azure中将数组或列表指定为字符串 - 这是否可能?
在我的Startup类构造函数中,我有:
var builder = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .AddEnvironmentVariables();

在我的 Startup 类的 Configure 方法中,我有:

var someSettings = configuration.GetSection("SomeSettings").Get<SomeSettings>();
4个回答

147

像这样在“应用设置”下添加设置将起到作用... 请注意下面的“:0”和“:1”

格式:键 -> 值

SomeSettings:PropA -> AzureValueA
SomeSettings:PropB:0 -> AzureValueB1
SomeSettings:PropB:1 -> AzureValueB2

如果你不是在Windows上运行,请将冒号 : 替换为双下划线 __,以便让应用程序看到设置。因此,你可以使用 SomeSettings__PropB__1 来代替 SomeSettings:PropB:1


2
截至今天,它运行得非常好。只想确认方法仍然存在。我们使用VSTS通过PS脚本部署WebApp参数,现在我们可以推送数组。谢谢。 - Alezis
5
你知道如何将 SomeSettings__PropB 表示为空数组吗? - gabe
1
这个也适用于Azure Functions的local.settings.json文件。 - joe
如果你有一个未命名的对象数组而不是普通值,该如何设置呢?我尝试了 SomeSettings__PropA__object__value 但好像无法正确设置。 - Wouter Vanherck
对于Windows系统,应该是SomeSettings__PropA:1还是SomeSettings__PropA__1? - Andrew
显示剩余2条评论

2

如果数组值是一个对象(请参见下面的WriteTo值),您可以复制整个WriteTo值,如果需要更新值,则可以创建应用程序设置,如下所示:

  "Serilog": {
    "WriteTo": [
      {
        "Name": "ApplicationInsights",
        "Args": {
          "restrictedToMinimumLevel": "Information",
          "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights",
          "instrumentationKey": "YOUR-KEY"
        }
      },
      {
        "Name": "UmbracoFile",
        "Args": {
          "RestrictedToMinimumLevel": "Error"
        }
      },
      {
        "Name": "Async",
        "Args": {
          "configure": [
            {
              "Name": "Console"
            }
          ]
        }
      }

    ]
  }

enter image description here


我似乎无法使其工作。我尝试使用 if 来管理具有大量属性和数组的特征管理过滤器。这需要发生什么特别的事情才能使其工作吗? - Michel Jansson
不,没有什么特别的。就是我在回答中描述的那样。希望这有所帮助。 - Nurhak Kaya

0

这在官方文档中有说明,但对我来说并不起作用。我的appsettings.json中的数组没有被覆盖。 - Koja
2
由于链接的文档似乎不再显示有关数组的内容,这里有另一个可以澄清这个模糊约定的东西:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-7.0#naming-of-environment-variables 双下划线符号的表示法可能适用(本身就很模糊),但关键是“数组索引应被视为此路径中的附加元素名称”。 - Josh Sutterfield
这对我来说很好,不确定数组是否有任何影响(选项对象被定义为数组而不是列表),但我确实将配置作为数组使用,并且我使用 IOptions,它很有效。 - undefined

-10

简单的方法是将 JSON 存储为 AppSetting 中的字符串,然后自己进行反序列化。

var serializer = new JavaScriptSerializer();
var settings = serializer.Deserialize<SomeSettings>(configuration.GetSection("SomeSettings"));

否则我认为你将不得不创建自己的客户配置。https://msdn.microsoft.com/zh-cn/library/2tw134k3.aspx


3
问题是关于“Azure Web 应用程序设置”,您的回答与此无关。 - Mohammad Nikravan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接