【问题标题】:Handling JSON circular reference exception in ASP.NET 5在 ASP.NET 5 中处理 JSON 循环引用异常
【发布时间】:2016-03-28 23:40:33
【问题描述】:

所以我在 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 中得到的只是信息量不大的“坏网关”页面。

【问题讨论】:

  • 我知道它可能没有答案,但 Newtonsofts json.net 可以通过多种方式处理循环引用,并且可以配置为 ASP.Net 的默认 JSON 序列化程序

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


【解决方案1】:

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

[JsonIgnore] 

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 使用此设置进行序列化时是否仍会得到循环引用?
    • 它对我有用,我使用的是 .Net 5。谢谢
    【解决方案3】:

    对于 ASP.NET Core:

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

    【讨论】:

      【解决方案4】:

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

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

      更多详情请见the issue

      【讨论】:

      • 正如我所提到的,我的问题不是关于如何解决问题,而是关于如何处理或至少记录这种异常。我认为还有其他像这样的“无法捕获”的异常,我想知道将来如何处理它。
      • @Dmitry:我不确定我是否正确理解了您的目标。旧版本Newtonsoft.Json 要么生成错误异常,要么导致 HTTP 平台处理程序崩溃。结果你得到异常“HTTP 502.3 Bad Gateway”。您可以将断点设置为任何 Web 方法并保持执行一分钟。您将在客户端看到错误“HTTP 502.3 Bad Gateway”。因此,您可能会收到错误网关错误的原因有很多。
      • 是的,它看起来像崩溃了 httpPlatformHandler。当我在调试器中执行时,我得到相同的错误页面“HTTP 502.3 Bad Gateway”。我该如何处理这种情况?例如,回到 JsonSerializationException 案例,我花了很长时间才看到异常本身。我必须使用 DNX 和 Kestrel 从控制台运行项目。在 IIS 中,我刚刚得到了那个 IIS 错误页面,很难从中说出发生了什么。通常的 ASP.NET 方法不会捕获该异常。因此,我想了解一些有关您应该如何诊断和治疗此类问题的信息。
      • @Dmitry:调试一些错误并不容易。您应该只知道 服务器挂起 HTTP 平台处理程序,它处理外部进程中对 ASP.NET 5 应用程序的所有请求,会产生错误 HTTP 502.3 Bad Gateway。如果您可以看到您的 Web Api 方法已完成且没有任何问题,并且您可以看到 later HTTP 502.3 Bad Gateway 那么它应该主要不是您的错误,但它可能是 MVC6 代码或代码中的问题都处于 RC 阶段的 HTTP 主机。
      • 是的,有些错误比其他错误更难调试:)。但是是否最不可能在某处看到异常记录?基本上找不到它的踪迹。 “HTTP 502.3 Bad Gateway”错误页面具有指向 TraceLogFiles 文件夹的“请求跟踪目录”链接,其中有一些 XML 文件,但没有提及其中的异常。
      猜你喜欢
      • 1970-01-01
      • 2011-01-01
      • 2022-01-24
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 2016-04-21
      • 2014-11-11
      • 1970-01-01
      相关资源
      最近更新 更多