如何停止 .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);
我遇到一些问题,我猜这些问题与使用 .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);