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

ASP.NET Core 7 WebAssembly控制器返回对象丢失Roles列表求助

ASP.NET Core 7 WebAPI返回User对象时Roles列表丢失的解决办法

核心问题分析

你在控制器中用Include(i => i.Roles)已经正确加载了用户的角色列表,且调试时用Newtonsoft.Json序列化能看到Roles,但客户端收到的JSON却没有这个字段。核心原因是ASP.NET Core 7默认使用System.Text.Json作为序列化器,它和Newtonsoft.Json的配置逻辑不同,加上User与Role的双向导航导致循环引用,System.Text.Json默认会忽略这类属性。

解决方案

方案1:配置System.Text.Json处理循环引用

修改Program.cs中控制器的JSON序列化配置,让它忽略循环引用并序列化导航属性:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        // 忽略循环引用,解决User和Role互相引用的问题
        options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
        // 确保非null的公共属性都被序列化
        options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
    });

方案2:切换回Newtonsoft.Json序列化

如果你更习惯使用Newtonsoft.Json(和调试时的序列化逻辑一致),先安装NuGet包Microsoft.AspNetCore.Mvc.NewtonsoftJson,然后配置:

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        // 忽略循环引用,避免序列化时出现异常
        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });

方案3:OData环境下的额外配置(如果使用OData)

如果你的接口是OData风格,需要确保EDM模型中包含Roles导航属性,并允许展开:

  1. 完善EDM模型构建:
private static IEdmModel GetEdmModel()
{
    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<User>("Users");
    builder.EntitySet<Role>("Roles");
    // 显式配置User与Role的多对多关系
    builder.EntityType<User>().HasMany(u => u.Roles).WithMany(r => r.Users);
    return builder.GetEdmModel();
}
  1. 客户端请求时添加$expand=Roles参数:
var uri = new Uri(_baseUri, $"Users({userId})?$expand=Roles");

额外排查点

  • 确认控制器中返回的user.Roles确实有数据(可以在return前加Debug.Assert(user.Roles != null && user.Roles.Any());)
  • 检查User类的Roles属性是否被添加了[JsonIgnore]或[IgnoreDataMember]注解(你的代码中没有,但可以再次确认)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:22:51