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

ASP.NET 5+SignalR项目返回数据时报对象循环JsonException如何解决

异常排查与解决步骤
  • 首先你之前配置的AddNewtonsoftJson仅对ASP.NET Core的MVC控制器生效,SignalR默认使用独立的序列化配置,不共享MVC的序列化设置,这是配置不生效的核心原因。

方案1:使用默认System.Text.Json配置SignalR序列化(推荐)

不需要额外引入Newtonsoft相关依赖,直接在Startup.cs/Program.cs的SignalR注册处添加配置即可:

using System.Text.Json.Serialization;

services.AddSignalR()
    .AddJsonProtocol(options =>
    {
        // 处理循环引用问题
        options.PayloadSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
        // 若为对象深度超过限制,可按需调整最大深度,默认值为64
        options.PayloadSerializerOptions.MaxDepth = 128;
    });

方案2:为SignalR单独配置Newtonsoft.Json序列化

如果你项目统一使用Newtonsoft.Json,需要先安装NuGet包Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson,再添加如下配置:

services.AddSignalR()
    .AddNewtonsoftJsonProtocol(options =>
    {
        options.PayloadSerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    });

额外排查点

  • 确认你返回的是你贴出的纯DTO类,而非直接返回EF Core的跟踪实体。如果直接返回EF实体,序列化时可能触发懒加载自动加载导航属性,产生你感知不到的循环引用。建议查询时使用AsNoTracking(),或通过AutoMapper等工具将EF实体映射到纯DTO后再返回。
  • 若配置后仍报错,可在返回数据前手动序列化待返回的对象进行本地调试,确认对象本身是否存在隐藏的循环或深度超标问题:
// 测试序列化
var returnData = 你的TeamBreaksDashboard实例;
// 这里如果直接抛出异常,说明返回的对象本身存在结构问题,可打断点查看对象实际结构
var testJson = System.Text.Json.JsonSerializer.Serialize(returnData);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:36:03