ASP.NET Web Api返回错误数据

时间:2017-01-12 23:03:58

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

我已经通过脚手架生成了我的Web Api Controller,我添加了WebApiConfig和Web Api,但返回了错误的数据。

例如: 我有一些实体 - 具有属性ID名称,姓氏等的玩家和PositionId,具有属性名称和ID的位置。如果我想通过普通的PositionController访问一个位置它工作得很好但是当我试图通过web api访问一个位置它返回我所有与这个位置相关的对象。

E.g。我想通过网址api/PositionsAPI/1获得一个位置 它应该返回

{"PositionId":1,"name":"Defensive midfield"}

但它返回

{"Players":[{"Team":{"Players":[{"PlayerId":4,"Name":"Piotrek","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1}],"TeamId":1,"Name":"FC. Barcelona","City":"Barcelona","Founded":"1899-11-29T00:00:00"},"PlayerId":2,"Name":"Jan","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1},{"Team":{"Players":[{"PlayerId":2,"Name":"Jan","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1}],"TeamId":1,"Name":"FC. Barcelona","City":"Barcelona","Founded":"1899-11-29T00:00:00"},"PlayerId":4,"Name":"Piotrek","Surname":"Kowalski","Nation":"Poland","PositionId":1,"TeamId":1}],"PositionId":1,"name":"Defensive midfield"}

所以你可以看到它返回与这个位置相关的所有玩家。我不知道为什么会这样。

这是来自我的web api控制器的方法,负责api/PositionsAPI/1

[ResponseType(typeof(Position))]
public IHttpActionResult GetPosition(int id)
{
    Position position = db.Positions.Find(id);
    if (position == null)
    {
        return NotFound();
    }

    return Ok(position);
}

2 个答案:

答案 0 :(得分:1)

您可以使用所需的属性返回匿名对象。例如,

var position = db.Positions // Make sure type is var
   .Where(x => x.PositionId == id)
   .Select(x => new 
   { 
      PositionId = x.PositionId,
      name = x.name
   })
   .FirstOrDefault();

或禁用序列化参考。

db.Configuration.ProxyCreationEnabled = false;

答案 1 :(得分:0)

如果没有看到您对实体建模的方式有点困难,请检查您的路由是否配置正确。例如,您提到过:

  

API / PositionsAPI / 1

我假设PositionsAPI是您的控制器,而您的位置对象如下所示:

public class Position
{
    public int PositionId {get; set;}
    public string name {get; set;}
}

所以你应该看到你期望的JSON ......

确保您在正确的控制器中使用正确的方法。尝试在方法的第一行添加断点,从Visual Studio运行它并尝试通过一些REST客户端(如Postman)获取数据。如果您没有通过调用相同的端点来访问断点,那么您很可能遇到路由问题。

为了修复为每个控制器指定Routes,如下所示:

[RoutePrefix("PositionsAPI")]
public class PositionsAPIController : ApiController

在您的方法上执行此操作以确保您没有使用其他方法:

//GET: api/PositionsAPI/1 (this is just to make it easier for future reference)
[ResponseType(typeof(Position))]
[HttpGet]
[Route("{id}")]
public IHttpActionResult GetPosition(int id)
    {
        Position position = db.Positions.Find(id);
        if (position == null)
        {
            return NotFound();
        }

        return Ok(position);
    }

希望有所帮助!