在azure app service应用程序设置中覆盖数组

时间:2018-05-07 06:16:32

标签: c# azure asp.net-core azure-web-sites

在我的.NET Core应用程序中,我向appsettings.json添加了一个数组,如下所示:

{
  "SettingsA": {
    "PropA": [
        "ChildObjectA": {
          ...
        },
        "ChildObjectB": {
          ...
        }
    ]
  }
}

如果我想在我的azure应用服务中的应用程序设置中覆盖该值,那么它将具有空数组:

{
  "SettingsA": {
    "PropA": []
  }
}

有办法做到这一点吗?

我试图把

SettingsA:PropsA  ->  []

在应用程序设置中,但它似乎没有覆盖appsettings.json的值

5 个答案:

答案 0 :(得分:2)

这里的答案https://www.ryansouthgate.com/2016/03/23/iconfiguration-in-netcore/是,您可以覆盖数组中的元素或添加其他元素,但是他说您不能覆盖整个数组,这似乎很奇怪。

用于覆盖的语法使用从零开始的访问权限,例如SettingsA:PropA:0:Something,我已经在App Services上进行了尝试,并且可以确认它是否有效。

答案 1 :(得分:1)

您可以使用AddEnvironmentVariables属性来实现override appsettings on azure到本地设置。

首先在门户中配置设置: enter image description here

注意:此处的值为null。

要覆盖App Settings部分中的嵌套键,我们可以使用完整路径SettingsA:PropA作为名称或使用双下划线SettingsA__PropA来定义变量。你可以参考这个article

在本地,你可以配置如下: 在Startup.cs中:

public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            configuration = builder.Build();
        }
        public IConfiguration configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddOptions();
            services.Configure<SettingsOptions>(configuration.GetSection("SettingsA"));

        }

在appsettings.json中:

{"SettingsA": {
    "PropA": ["a","b"]
    }
}

在HomeController中:

private readonly IOptions<SettingsOptions> options;
        public HomeController(IOptions<SettingsOptions> options)
        {
            this.options = options;
        }

        public IActionResult Index()
        {
            var value = options.Value;
            ViewBag.Index = value.PropA+"success";
            return View();
        }

在SettingsOption中:

public class SettingsOptions
    {
        public string SettingsA { get; set; }
        public string PropA { get; set; }
    }

将项目发布到azure后,它将覆盖PropA值。 有关如何从asp.net核心读取appsetting的更多详细信息,请遵循此case

答案 2 :(得分:1)

只是在这里补充所有已经给出的好答案,这就是我们在现实生活中如何做到的。

我们需要在应用程序设置中配置一系列支持的语言。这是.NET Core项目中appSettings.json中的外观:

{
    ...

    "SupportedLanguages": [
        {
            "Code": "en-AU",
            "Name": "English (Australia)"
        },
        {
            "Code": "en-GB",
            "Name": "English (United Kingdom)"
        },
        {
            "Code": "en-US",
            "Name": "English (United States)"
        }
    ]
}

这就是最终在我们的Azure应用服务中查找的方式:

enter image description here

这有点奇怪,尤其是当您具有更大或更复杂的层次结构时,但我认为目前还没有另一种方法。

答案 3 :(得分:0)

据我所知,Application settings中的设置会在运行时注入appsettings.json ,从而覆盖现有设置。  它不会更改appsettings.json文件,因为Azure GUI(连接线程,应用程序设置)在内部使用环境变量。

以下是similar post供您参考。您可以通过VSTS在发布期间覆盖设置。以下是指向Colin's ALM Corner Build & Release Toolstutorial的链接。有关详细信息,请参阅上述帖子中的psycho回复。

  

如果需要在VSTS发布活动期间覆盖appsettings.json的值(在将其发布到Azure之前),Colin的ALM Corner Build&amp;可以使用发布工具。

答案 4 :(得分:0)

这是Microsoft团队非常奇怪的行为。看起来他们并不了解现实的样子。

我最后得到的是一个字符串,其中包含用逗号分隔的值而不是数组。

相关问题