.net core 使用带有附加环境变量的复杂结构 问题:
使用.net core 使用带有附加环境变量的复杂结构 问题:,.net-core,environment-variables,asp.net-core-2.0,.net Core,Environment Variables,Asp.net Core 2.0,使用ConfigurationBuilder的AddEnvironmentVariables方法设置配置时,如何处理复杂结构,如数组 i、 e.将调用哪些环境变量来表示以下结构 { "MyApp": { "SendAlertsTo": [ {"Name": "Joe Blogger", "Email": "JoeBlogger@exampl
ConfigurationBuilder
的AddEnvironmentVariables
方法设置配置时,如何处理复杂结构,如数组
i、 e.将调用哪些环境变量来表示以下结构
{
"MyApp": {
"SendAlertsTo": [
{"Name": "Joe Blogger", "Email": "JoeBlogger@example.com"},
{"Name": "Jane Doer", "Email": "JaneDoer@example.com"}
]
}
}
带上下文的详细版本
我们正在编写将托管在容器中的应用程序。最初,我们继续使用AppSettings.json
文件保存设置,在启动时通过entrypoint.sh
shell脚本从环境变量填充该文件的内容
我们后来意识到,我们可以使用ConfigurationBuilder
的AddEnvironmentVariables
方法直接从环境变量中提取值,从而避免了将entrypoint.sh
脚本作为每次添加新设置时更新的另一个位置的开销
这适用于应用程序设置文件,例如:
{
"MyApp": {
"SmtpServer": "smtp.example.com",
"FromAddress": "JoeyBlogger@example.com"
},
"Logging": {
"LogLevel": "Default"
}
}
。。这简单地解释为:
export MyApp:SmtpServer=smtp.example.com
export MyApp:FromAddress=JoeyBlogger@example.com
export Logging:LogLevel=Default
然而,我最近看到了一个开发人员的应用程序设置文件,用于一些新的监控,如下所示(注意:这不是托管环境中使用的实际设置;这只是一个触发此问题的示例)。在这种情况下,使用上述方法效果不太好,因为名称为Serilog:WriteTo:name
时会有两种不同的设置,并且任何开始的Serilog:WriteTo:Args:
都与哪个条目相关
{
"Serilog"
"WriteTo": [
{
"Name": "Async",
"Args": {
"configure": [
{
"Name": "File",
"Args": {
"path": ".\\log.txt",
"rollingInterval": "Day",
"retainedFileCountLimit": 7,
"buffered": true
}
}
]
}
},
{
"Name": "Async",
"Args": {
"configure": [
{
"Name": "Console"
}
]
}
}
]
}
}
我猜我们会通过某种索引来处理这个问题;但是我在文件里找不到任何关于这个的东西
export Serilog:WriteTo[0]:Name=Async
export Serilog:WriteTo[0]:Args:configure[0]:Name=File
export Serilog:WriteTo[0]:Args:configure[0]:Args:path=.\\log.txt
export Serilog:WriteTo[0]:Args:configure[0]:Args:rollingInterval=Day
export Serilog:WriteTo[0]:Args:configure[0]:Args:retainedFileCountLimit=7
export Serilog:WriteTo[0]:Args:configure[0]:Args:buffered=true
export Serilog:WriteTo[1]:Name=Async
export Serilog:WriteTo[1]:Args:configure[0]:Name=Console
然而,运行快速PoC表明上述方法不起作用。如何做到这一点?我在这里找到了解决方案: 答案是使用索引,但索引号被视为命名元素;i、 e
{
"MyApp": {
"SendAlertsTo": [
{"Name": "Joe Blogger", "Email": "JoeBlogger@example.com"},
{"Name": "Jane Doer", "Email": "JaneDoer@example.com"}
]
}
}
变成:
export MyApp:SendAlertsTo:0:Name=Joe Blogger
export MyApp:SendAlertsTo:0:Email=JoeBlogger@example.com
export MyApp:SendAlertsTo:1:Name=Jane Doer
export MyApp:SendAlertsTo:1:Email=JaneDoer@example.com
此外,对于Linux主机,还有一点我没有意识到/与数组问题无关。。:
分隔符应为\uuu
,因此上述内容变为:
export MyApp__SendAlertsTo__0__Name=Joe Blogger
export MyApp__SendAlertsTo__0__Email=JoeBlogger@example.com
export MyApp__SendAlertsTo__1__Name=Jane Doer
export MyApp__SendAlertsTo__1__Email=JaneDoer@example.com
您可以将名称中的
:
更改为双底镜\uuuuu
,这样就可以了