Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 使用带有附加环境变量的复杂结构 问题:_.net Core_Environment Variables_Asp.net Core 2.0 - Fatal编程技术网

.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
,这样就可以了