【问题标题】:ASP.NET Core MVC/WEB API with self-referencing type does not return json array具有自引用类型的 ASP.NET Core MVC/WEB API 不返回 json 数组
【发布时间】:2016-12-06 14:40:42
【问题描述】:

WEB API 开发者您好!

当我尝试在 MVC6 中使用我的 WEB API 返回数组对象时遇到问题。

在调试控制器上,我获得了两个或更多对象,但结果只发送了一个对象的响应。我不知道还有什么可以解决这个问题。请帮帮我!

我的控制器方法:

[HttpGet]
    public IEnumerable<Maquina> Get()
    {
        var maquinas = _cobraAppContext.Maquina
            .Include(m => m.IdMarcaMotorNavigation)
            .Include(m => m.IdModeloNavigation)
            .ToList();
        return maquinas;//Two or more object obtains :(
    }

只有 1 个对象的响应,但我的控制器调试显示不止一个:

[
  {
    "id": 1,
    "nombre": "M1",
    "idModelo": 3,
    "serie": "123456",
    "idMarcaMotor": 3,
    "serieMotor": "123456789",
    "descripcion": "ejemplo 123",
    "fechaCreacion": "2016-12-06T08:30:51.307",
    "idMarcaMotorNavigation": {
      "id": 3,
      "nombre": "DAEWO",
      "descripcion": "DAEWO",
      "fechaCreacion": "2016-11-29T15:17:33.223",
      "maquina": []
    }
  }
]

【问题讨论】:

  • 你是如何调用这个 api 端点的?
  • 用邮递员什么的做一个get请求
  • 问题可能出在客户端。如果您可以通过尝试访问此 api 的方式更新您的问题,那将很有帮助。
  • 我已添加图片。我在邮递员、angularjs 应用程序和谷歌浏览器上获得了相同的响应。
  • 展开maquinas对象

标签: c# asp.net-web-api asp.net-core-mvc


【解决方案1】:

尝试另一种方法(在配置方法中,Startup.cs):

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

【讨论】:

  • 所以我认为是循环引用。
  • @raphaelheitor 循环引用不会返回而是抛出异常
  • @Alex 你确定吗?见这里:github.com/aspnet/Mvc/issues/4160
  • 你可能是对的,maquinas 对象中的第二个对象可能在 MarcaMotorNavigation 中有循环引用
  • @user2911678 循环参考。 MotorNavigation 有一个 Maquina 类型的对象。 (循环引用)
【解决方案2】:

将您的方法签名更改为IHttpActionResult,将您的控制器更改为ApiController,如下所示:

 public IHttpActionResult Get()
    {
        var maquinas = _cobraAppContext.Maquina
            .Include(m => m.IdMarcaMotorNavigation)
            .Include(m => m.IdModeloNavigation)
            .ToList();
        return Ok(maquinas);//Two or more object obtains :(
    }

【讨论】:

  • 这是网络接口
  • 那又怎样??我知道这是一个网络 API。我不明白你的意思
  • Web api 将序列化 ienumerable
  • 他的解决方案中的问题是 IEnumerable 使用延迟执行,这意味着它一次获取一个实体。因此,他一次只得到一个对象。
  • 尝试将 .ToList() 更改为 .AsQueryable()
猜你喜欢
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多