如何停止 .Net Core Web API 中的自引用循环?

How to stop self-referencing loop in .Net Core Web API?

我遇到一些问题,我猜这些问题与使用 .NET Core Web API 和 Entity Framework Core 的自引用有关。当我为某些导航属性添加 .Includes 时,我的网站 API 开始卡住。

我在旧版 Web API 中找到了一个解决方案,但我不知道如何为 .NET Core Web API 实现相同的解决方案(我还在早期学习阶段)。

旧的解决方案是将其粘贴在 Global.asax 的 Application_Start() 中:

 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;

我怀疑这是在 StartUp 的 ConfigureService() 方法中处理的,但除此之外我不知道太多。

或者有没有更合适的方法来处理这个问题?

好吧...我终于找到了一些参考资料material。解决方案是:

public void ConfigureServices(IServiceCollection services)
{
    ...

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

    ...
}

我从 here

那里得到了这个

ReferenceLoopHandling.Ignore“隐藏”问题,而不是解决问题。您真正需要做的是构建层。创建域对象以位于您的实体之上,并将它们包裹在某种 service/business 层中。查找存储库模式并在有帮助时应用它。您需要在实体和领域对象之间进行映射,这让您有机会适应某种映射器(自动映射器)和验证层。

如果你的领域对象和实体是完全一样的,那么你需要多考虑一下你在做什么。

例如:您的实体是否有软删除? (IsDeleted) 标志?如果是这样,这不一定需要通过网络返回给客户端,所以这是它们不同之处的完美示例。

无论哪种方式,答案都不是在 JSON 中覆盖它,而是改变你的架构..

如果您正在使用 ASP.NET Core 3.0,并且遇到该问题,请安装 NuGET 包:Microsoft.AspNetCore.Mvc.NewtonsoftJson 3.0.0 .

要替换没有参考循环处理的新System.Text.Json,请在Startup.cs中执行此操作,确保在ConfigureServices中,包括:

如果使用最新的.Net Core 3.0方式:

services.AddControllers().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

或旧方法:

services.AddMvc(option => option.EnableEndpointRouting = false)
       .AddNewtonsoftJson(options => 
                 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore)
       .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);