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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:06:09