在我的.NET Core应用程序中,我向appsettings.json添加了一个数组,如下所示:
{
"SettingsA": {
"PropA": [
"ChildObjectA": {
...
},
"ChildObjectB": {
...
}
]
}
}
如果我想在我的azure应用服务中的应用程序设置中覆盖该值,那么它将具有空数组:
{
"SettingsA": {
"PropA": []
}
}
有办法做到这一点吗?
我试图把
SettingsA:PropsA -> []
在应用程序设置中,但它似乎没有覆盖appsettings.json的值
答案 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到本地设置。
注意:此处的值为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应用服务中查找的方式:
这有点奇怪,尤其是当您具有更大或更复杂的层次结构时,但我认为目前还没有另一种方法。
答案 3 :(得分:0)
据我所知,Application settings中的设置会在运行时注入appsettings.json
,从而覆盖现有设置。
它不会更改appsettings.json文件,因为Azure GUI(连接线程,应用程序设置)在内部使用环境变量。
以下是similar post供您参考。您可以通过VSTS在发布期间覆盖设置。以下是指向Colin's ALM Corner Build & Release Tools和tutorial的链接。有关详细信息,请参阅上述帖子中的psycho回复。
如果需要在VSTS发布活动期间覆盖appsettings.json的值(在将其发布到Azure之前),Colin的ALM Corner Build&amp;可以使用发布工具。
答案 4 :(得分:0)
这是Microsoft团队非常奇怪的行为。看起来他们并不了解现实的样子。
我最后得到的是一个字符串,其中包含用逗号分隔的值而不是数组。