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

.NET 3.1中HttpClient调用SendAsync出现Object Cycle JSON异常

问题根因

首先明确两个核心误区:

  1. 你在Startup中配置的序列化规则,仅作用于ASP.NET Core控制器层将返回值序列化为HTTP响应的阶段,对你当前业务代码里的HTTP请求发送、手动JSON解析逻辑没有任何影响。
  2. .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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:06:04