ReferenceLoopHandling.Ignore 在 WebApi Global.asax 中不起作用

Posted

技术标签:

【中文标题】ReferenceLoopHandling.Ignore 在 WebApi Global.asax 中不起作用【英文标题】:ReferenceLoopHandling.Ignore not working in WebApi Global.asax 【发布时间】:2016-01-25 15:58:50 【问题描述】:

我有一个 API 端点,它返回一个循环错误(因为它链接了一个循环返回的连接类),例如

class A

     virtual ClassAB;


class B

     virtual ClassAB;


class AB

     virtual ClassA;
     virtual ClassB;
    

在 API GET 中,我需要从 ClassA 的角度返回 ClassB 的详细信息(在 ClassB GET 中反之亦然)。

当我得到时,我会执行以下操作:

IQueryable<ClassA> results = _dbset
    .Include(x => x.ClassAB)
    .Include(x => x.ClassAB.Select(y => y.ClassB))
    .AsExpandable()
    .Where(predicate)
    .OrderBy(x => x.ID);

所以我得到了自引用循环错误。现在在我的数据库上下文中,我有:

Configuration.ProxyCreationEnabled = false;
Configuration.LazyLoadingEnabled = false;

在我的Global.asax protected void Application_Start() 我有:

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

但是,我仍然收到错误消息;任何想法如何解决这个问题?

【问题讨论】:

能否请您添加异常详细信息。异常类型、消息、堆栈跟踪等 @matthew Flynn:有什么例外? @Matthew ,我遇到了同样的错误,但找不到解决方法。作为一种解决方法,而不是返回整个结果集,我只从 web api 控制器返回所需的属性作为匿名类型。 【参考方案1】:

尝试添加

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None;

【讨论】:

以上是关于ReferenceLoopHandling.Ignore 在 WebApi Global.asax 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章