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

时间:2015-12-22 16:33:37

标签: c# iis asp.net-core json.net

所以我在ASP.NET 5中使用Web API。在某些时候我的应用程序停止工作,只显示“Bad Gateway”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都是相当无法提供信息的“Bad Gateway”页面。

4 个答案:

答案 0 :(得分:14)

尝试将最新版本8.0.1-beta3中的Newtonsoft.Json添加到package.json中的相关内容并使用

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

有关详细信息,请参阅the issue

答案 1 :(得分:1)

对于ASP.NET Core:

var mvc = services.AddMvc(options =>
{
   //mvc options
});

mvc.AddJsonOptions(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

答案 2 :(得分:0)

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

[JsonIgnore] 

(在我的例子中是 Newtonsoft)到所有虚拟属性,它运行良好。

答案 3 :(得分:-1)

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

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