You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不通过DI创建类从appsettings.json集合读取单个值

读取appsettings.json中Serilog配置的serverUrl值(无DI方式)

正确实现方式

方式1:直接通过索引定位数组元素

因为WriteTo是数组结构,第一个元素的索引为0,可以直接用完整配置路径读取:

var configurationBuilder = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: false)
    .AddJsonFile($"appsettings.{environmentName}.json", optional: true)
    .AddEnvironmentVariables();

IConfiguration _configuration = configurationBuilder.Build();

// 直接用索引定位数组元素,路径用冒号分隔
var serverUrl = _configuration.GetValue<string>("Serilog:WriteTo:0:Args:serverUrl");

方式2:遍历数组筛选目标节点(更灵活)

如果Seq节点在WriteTo数组中的位置不固定,可以遍历子节点并筛选Name为Seq的项:

var writeToSection = _configuration.GetSection("Serilog:WriteTo");
// 遍历数组元素
foreach (var section in writeToSection.GetChildren())
{
    if (section.GetValue<string>("Name") == "Seq")
    {
        var serverUrl = section.GetValue<string>("Args:serverUrl");
        // 后续处理逻辑
        break;
    }
}

// 或者用LINQ简化
var serverUrl = writeToSection.GetChildren()
    .FirstOrDefault(s => s.GetValue<string>("Name") == "Seq")?
    .GetValue<string>("Args:serverUrl");

你之前尝试失败的原因

  1. 第一次尝试:_configuration.GetSection("Serilog").GetChildren().First()获取的是WriteTo节点(Serilog的直接子节点只有WriteTo),而非数组里的具体项,后续读取Args::serverUrl自然找不到对应值。
  2. 第二次尝试:配置路径缺少数组元素的索引(WriteTo是数组,必须指定0这类索引定位元素),同时错误使用了::分隔符,.NET配置系统统一用冒号:分隔路径。
  3. 第三次尝试:同样错误地将WriteTo节点当成了数组元素,需要先调用GetChildren().First()获取数组内的具体项,再读取Args下的serverUrl。

内容的提问来源于stack exchange,提问作者user21996911

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 07:03:15