.NET 3.1中HttpClient调用SendAsync出现Object Cycle JSON异常
问题根因
首先明确两个核心误区:
- 你在Startup中配置的序列化规则,仅作用于ASP.NET Core控制器层将返回值序列化为HTTP响应的阶段,对你当前业务代码里的HTTP请求发送、手动JSON解析逻辑没有任何影响。
- .NET Core 3.1 内置的
System.Text.Json原生不支持ReferenceHandling.Preserve配置,该特性是.NET 5及以上版本才新增的,所以你写的AddJsonOptions配置完全不生效。
你遇到的异常触发场景大概率是以下两种之一:
- 项目中存在全局日志/审计中间件,会自动序列化
HttpRequestMessage请求对象打印日志,该对象本身存在循环引用结构,用默认的System.Text.Json序列化就会抛出该错误 - 你返回的
CountryRegistry实体类本身存在循环引用的导航属性,控制器返回序列化时配置的Newtonsoft.Json规则未生效
解决方案
1. 先修正基础代码错误
你已经注入了IHttpClientFactory,不要手动new HttpClient,否则会导致套接字资源耗尽问题,修改实例化逻辑:
// 删掉 var client = new HttpClient(); var client = _clientFactory.CreateClient();
2. 确保控制器层全局序列化配置生效
.NET 3.1 环境下统一使用Newtonsoft.Json作为全局序列化器,删掉无效的AddJsonOptions配置,保留如下配置即可:
services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; // 可选:加大序列化深度限制,避免层级过深报错 options.SerializerSettings.MaxDepth = 64; });
3. 排查中间件序列化逻辑
如果异常确实在SendAsync请求执行阶段触发,检查项目中所有自定义中间件,若存在序列化请求/响应对象的逻辑,需要单独给这部分序列化逻辑加上循环引用忽略配置,不要使用默认的System.Text.Json实例。
4. 可选:手动解析JSON时增加深度配置
如果断点确认异常触发在JObject.Parse阶段,可以给解析逻辑加大深度限制:
var registry = JObject.Parse(content, new JsonLoadSettings { MaxDepth = 128 });
5. 实体类优化
检查CountryRegistry实体类,如果存在不需要序列化的循环导航属性,给属性加上[JsonIgnore]标签即可。
内容的提问来源于stack exchange,提问作者Jhonata Galante
相关产品推荐
相关产品推荐

