在ASP.NET 5中处理JSON循环引用异常

本文关键字:JSON 循环 引用 异常 处理 ASP NET | 更新日期: 2023-09-27 18:27:42

所以我在ASP.NET 5中玩Web API。在某个时候,我的应用程序停止了工作,只显示"坏网关"IIS错误页面(我在IIS Express中按F5运行它)。我花了一段时间才弄清楚问题是什么——我在Web API方法返回的第一类中引入了一个循环引用,如下所示:

public class CircularParent
{
    public CircularChild Data;
    public CircularParent()
    {
        Data = new CircularChild(this);
    }
}
public class CircularChild
{
    public CircularParent Owner { get; set; }
    public CircularChild(CircularParent owner)
    {
        Owner = owner;
    }
}

结果是JsonSerializationException。我的问题不在于如何解决,而在于未来如何应对这种情况。我该如何处理这样的异常?或者至少是如何记录它,或者只是在某个地方看到它被记录?UseDeveloperExceptionPage()没有帮助。UseExceptionHandler(errorApp => errorApp.Run(...))也没有帮助,执行不会进入errorApp.Run()。调试器不会在异常处中断。我从IIS得到的只是一个相当没有信息的"坏网关"页面。

在ASP.NET 5中处理JSON循环引用异常

尝试将最新版本8.0.1-beta3中的Newtonsoft.Json添加到package.json中的依赖项中,并使用

services.AddMvc()
    .AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling =
            Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    });

有关更多详细信息,请参阅本期。

对于ASP.NET核心:

var mvc = services.AddMvc(options =>
{
   //mvc options
});
mvc.AddJsonOptions(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

对于ASP.NET Core 2.2,请在Startup.cs 中使用Configure方法

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    JsonConvert.DefaultSettings = () => new JsonSerializerSettings
    {
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
    };
}

这可能是一种迂回的方法,但我做了一个数据库第一次迁移,它分配了虚拟属性,当它工作时,会导致循环引用。我通过添加解决了这个问题

[JsonIgnore] 

(在我的案例中是Newtonsoft)到所有虚拟财产,效果很好。