Azure Function运行报Newtonsoft.Json自引用循环错误,已配置启动文件仍无效
配置未生效的原因
- Azure Function 进程内运行时内置了独立的Newtonsoft.Json序列化实例,返回HTTP响应、绑定输出时会优先使用内置配置,
JsonConvert.DefaultSettings仅对业务代码中手动调用JsonConvert.SerializeObject的场景生效,无法覆盖运行时自带的序列化逻辑。 - 如果你使用的是.NET隔离工作进程(Isolated Worker)模型的Azure Function,Startup类的Configure方法本身不会接管序列化配置,该模式的序列化配置有独立的注入路径。
解决方案
方案1:进程内(In-Process)模型适用
方法1:接口返回时手动序列化返回ContentResult
// 不要直接返回对象,手动序列化后返回ContentResult public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req) { var yourData = GetYourDataWithReferenceLoop(); var json = JsonConvert.SerializeObject(yourData); return new ContentResult { Content = json, ContentType = "application/json", StatusCode = 200 }; }
方法2:替换运行时内置的Json序列化配置
在Startup的Configure方法中添加如下注入逻辑:
public override void Configure(IFunctionsHostBuilder builder) { builder.Services.AddMvcCore().AddNewtonsoftJson(options => { options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; options.SerializerSettings.Formatting = Formatting.Indented; }); // 保留手动调用JsonConvert时的默认配置 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Formatting = Formatting.Indented, ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; }
方案2:.NET隔离工作进程(Isolated Worker)模型适用
在Program.cs中配置序列化选项:
var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults(builder => { // 若使用默认的System.Text.Json,配置如下 builder.Services.Configure<JsonSerializerOptions>(options => { options.ReferenceHandler = ReferenceHandler.IgnoreCycles; }); // 若要切换为Newtonsoft.Json,需先安装Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore包,再添加如下配置 builder.Services.AddMvcCore().AddNewtonsoftJson(options => { options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; }); }) .Build(); host.Run();
临时快速修复方案
如果不想修改全局配置,可直接在出现自引用的导航属性上添加[JsonIgnore]特性,直接切断循环引用链即可。
内容的提问来源于stack exchange,提问作者johnson dubula
相关产品推荐
相关产品推荐

