Configuration.bind未设置值

后端开发 2026-07-12

我在appsettings中有如下这段配置:

"ExternalApiSettings": [
    {
        "User": "Administrator",
        "Key": "From user secrets",
        "Roles": [
            "Admin"
        ],
        "Controllers": [
            "All"
        ]
    }
],

我想把它绑定到下列类的Users属性:

public static class ExternalApiSettings
{
    public static IEnumerable<ExternalApiUser> Users { get; set; } = Array.Empty<ExternalApiUser>();
}

通过以下内容

builder.Configuration.GetSection("ExternalApiSettings").Bind(ExternalApiSettings.Users);

但是在访问 ExternalApiSettings.Users 时,总是得到一个空数组。

如果我执行下面的

ExternalApiSettings.Users = configuration.GetSection(nameof(ExternalApiSettings)).Get<IEnumerable<ExternalApiUser>>();

Users会被填充,那么绑定不工作是否有原因?

另外,我代码中的其他绑定都能正常工作——例如

builder.Configuration.GetSection("Umbraco:CMS:Content:Error404Collection").Bind(SiteSettings.ErrorPageCollection);

"Umbraco": {
    "CMS": {
        "Content": {
            "AllowEditInvariantFromNonDefault": true,
            "Error404Collection": [
                {
                    "Culture": "default",
                    "ContentKey": "aff1fbee-5a34-4c89-a7b2-4bcdbf4a6529"
                }
            ],
        }
    }
}

public static class SiteSettings
{
    public static IEnumerable<ErrorPageSettings> ErrorPageCollection { get; set; } = Array.Empty<ErrorPageSettings>();
}

解决方案

你的问题在于你正在调用扩展方法 ConfigurationBinder.Bind() 的某个重载:

void Bind(this IConfiguration configuration, object? instance);

尝试将给定的对象实例绑定到配置值,方法是递归地将属性名与配置键进行匹配。

该扩展方法的所有重载都需要接收一个 object? instance —— 但你实际传入的对象是一个空的不可变集合,具体来说是 Array.Empty<ExternalApiUser>()。由于数组不能添加元素,因此绑定会失败。

并且,与 public static T? ConfigurationBinder.Get<T>(this IConfiguration configuration) 不同,API没有办法返回一个新列表来替换现有数组。

相反,请使用一个可变集合,例如 List<T>

public static class ExternalApiSettings
{
    public static IEnumerable<ExternalApiUser> Users { get; set; } =  new List<ExternalApiUser>();
}

public static class SiteSettings
{
    public static IEnumerable<ErrorPageSettings> ErrorPageCollection { get; set; } = new List<ErrorPageSettings>();
}

演示fiddle #1在此 这里.


注:在你的问题中你说对 public static IEnumerable ErrorPageCollection { get; set; } = Array.Empty(); 的绑定工作正常,但我测试时也失败,参见演示fiddle #2 这里

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章