如何从 programs.cs Blazor 应用中的配置获取 appsettings.json 中的设置值

How do I get the value of a setting in appsettings.json from configuration in programs.cs Blazor app

任何人都可以告诉我如何从 Blazor(核心 5)应用程序的 program.cs 文件中的 appsettings.json 文件中获取值。 基本上只需要正确编写“var seqUrl =”即可。我认为。 请谢谢。

在我 Program.cs 的 Main 方法中,我有

IConfiguration configuration = new ConfigurationBuilder()                
            .AddJsonFile("appsettings.json", false, true)
            .AddJsonFile("appsettings.Development.json", true, true)
            .Build();
        var levelSwitch = new LoggingLevelSwitch();
        var seqUrl = configuration.GetSection("SeriLog").GetSection("WriteTo").GetSection("Name:Seq").GetSection("Args").GetSection("serverUrl").Value;
        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .MinimumLevel.ControlledBy(levelSwitch)
            .WriteTo.Seq(seqUrl, 
            apiKey: "xxxxxxxxxxxx",
            controlLevelSwitch: levelSwitch)
            .CreateLogger();

我的 appsettings.json 看起来像这样。

"SeriLog": {
"Using": [
  "Serilog.Sinks.File",
  "Serilog.Sinks.Seq",
  "Serilog.Sinks.Console"
],
"MinimumLevel": {
  "Default": "Information",
  "Override": {
    "Microsoft": "Warning",
    "system": "Warning"
  }
},
"Enrich": [ "WithMachineName", "WithEnvironmentUserName", "WithClientIp", "WithClientAgent", "WithEnvironmentName", "WithProcessId", "WithProcessName", "WithThreadId" ],

"WriteTo": [ 
  {
    "Name": "File",
    "Args": {
      "path": "C:\Temp\Logs\JsonLog.json",
      "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
      "rollingInterval": "Day"
    }
  },
  {
    "Name": "Seq",
    "Args": {
      "serverUrl": "http://xxxxxxxxxxx" 
    }
  }     
]

我认为您应该考虑在您的 appsettings 文件中重组 JSON。 “WriteTo”的值是一个数组,但我会让它只是一个对象而不是数组,那么每个元素都应该是一个子对象。使用“名称”变量来命名它们。像这样:

"WriteTo": { 
    "File": {
        "Args": {
        "path": "C:\Temp\Logs\JsonLog.json",
        "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
        "rollingInterval": "Day"
        }
    },
    "Seq": {
        "Args": {
        "serverUrl": "http://xxxxxxxxxxx" 
        }
    }     
}

然后您应该能够使用与您相同的样式检索值,只需使用所需变量的完整路径即可。例如:

var seqUrl = configuration.GetSection("SeriLog:WriteTo:Seq:serverUrl").Value; 我不记得这个语法是否 100% 正确(路径可能不是冒号分隔,我不完全确定)但这个概念应该有效。您只是没有在代码中的 .GetSection() 方法中输入正确的名称,我认为当您尝试检索这样的数组元素时会有点棘手,因此我建议从数组转换为简单的对象。