使用JSON.Net“检测到自我引用循环”异常

时间:2016-11-07 18:50:20

标签: c# asp.net json serialization json.net

我有一些代码可以将Route个对象列表发送到我的View(ASP.Net MVC):

public ActionResult getRouteFromPart(int partId)
{
    List<Route> routes = _routeService.GetRouteByPartType(partId);

    if (routes == null)
    {
        return this.AdvancedJsonResult(null, JsonRequestBehavior.AllowGet);
    }

    return this.AdvancedJsonResult(new
    {
        Routes = routes
    }, JsonRequestBehavior.AllowGet);
}

但是我在AdvancedJsonResult课程中遇到了例外:

if (Data != null)
{
    var settings = new JsonSerializerSettings
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver()
    };

    string result = JsonConvert.SerializeObject(this.Data, this.Formatting, settings);
    response.Write(result);
}

我已经尝试了“ReferenceLoopHanding.Ignore”技巧,它会使异常静音,但列表仍然没有传递给视图。

当我将routes更改为单个对象而不是列表时,代码有效,所以我认为代码不喜欢使用列表。

我是这个项目的新手,所以我不确定如何解决这个问题并使用List很高兴...

编辑:这是完整的异常消息,该消息发生在string result = JsonConvert...行。

  

使用类型'System.Data.Entity.DynamicProxies.PartNumber_B135A5D16403B760C3591872ED4C98A25643FD10B51246A690C2F2D977973452'检测到自引用循环。路径'路线[0] .incomingLots [0] .partNumber.partType.partNumbers'。

2 个答案:

答案 0 :(得分:1)

该错误消息的含义是存在一个自引用循环。您必须将数据库上下文设置为在请求某些实体时不希望获取所有链接的实体。可以通过在DbContext类构造函数中添加两行以禁用自引用循环来完成此操作,如下所示:

public YourDbContext() : base("name = YourDbContext")
{       
    //add these lines in order to avoid from "Self referencing loop detected for ..." error
    this.Configuration.LazyLoadingEnabled = false;
    this.Configuration.ProxyCreationEnabled = false;
}

希望这对您有帮助...

答案 1 :(得分:0)

基于Json.net的默认Json格式化程序的正确答案是将ReferenceLoopHandling设置为Ignore。

只需将其添加到Global.asax中的Application_Start

HttpConfiguration config = GlobalConfiguration.Configuration;

config.Formatters.JsonFormatter
            .SerializerSettings
            .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

这是正确的方法。它将忽略指向该对象的引用。

其他响应的重点是通过排除数据或制作门面对象来更改返回的列表,有时这不是选择。

使用JsonIgnore属性限制引用可能很耗时,并且如果您要从另一个问题开始对树进行序列化,那将是一个问题。

Entity framework self referencing loop detected

复制