所以我在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”页面。
答案 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,
};
}