.NET 8 WorkerService配置重复值问题:为何出现重复输出?
.NET 8 WorkerService配置数组重复加载问题分析
问题描述
在.NET 8 WorkerService项目中,通过Host.CreateApplicationBuilder加载appsettings.json和appsettings.Development.json配置,其中Units配置节是包含多个对象的数组。绑定配置到Unit[]后,遍历输出路径时出现重复值,每个单元的路径都被打印两次。
代码示例
Program.cs
var builder = Host.CreateApplicationBuilder(args); var units = builder.Configuration.GetSection("Units").Get<Unit[]>(); foreach (var unit in units) { foreach (var item in unit.Paths) { Console.WriteLine(item); } } public record Unit(string Name, string[] Paths);
appsettings.json
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.Hosting.Lifetime": "Information" } }, "Units": [ { "name": "test1", "paths": [ "p1", "p2", "p3" ] }, { "name": "test2", "paths": [ "p4", "p5", "p6" ] } ] }
appsettings.Development.json
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.Hosting.Lifetime": "Information" } } }
预期与实际输出
预期输出
p1 p2 p3 p4 p5 p6
实际输出
p1 p2 p3 p1 p2 p3 p4 p5 p6 p4 p5 p6
问题成因
出现重复输出的核心原因是配置系统中Units数组被加载了两次,绑定后数组元素被合并(追加),最终Unit[]包含两组完全相同的单元对象。
具体可能的触发场景:
- 配置源重复加载:项目中意外重复添加了同一配置文件(比如手动调用
builder.Configuration.AddJsonFile("appsettings.json"),加上Host.CreateApplicationBuilder默认加载的一次),导致Units数组被读取两次并合并。 - 环境配置或启动设置异常:
launchSettings.json中配置了额外的配置源参数,或环境变量指定了重复的配置文件路径,导致同一配置被多次加载。 - 项目文件复制设置问题:
appsettings.json被设置为多次复制到输出目录,配置系统读取到多个相同的文件实例,进而重复加载数组内容。
另外,配置绑定对大小写不敏感(JSON中的name与record的Name可以正常匹配),这不会导致重复项,可排除属性名大小写的影响。
内容的提问来源于stack exchange,提问作者Christopher Fontaine
相关产品推荐
相关产品推荐

