繁体   English   中英

ASP.NET Web Api 返回错误数据

[英]ASP.NET Web Api returns bad data

我通过脚手架生成了我的 Web Api 控制器,我添加了 WebApiConfig 和 Web Api 工作但返回错误数据。

例如:我有一些实体 - 具有属性 ID 名称、姓氏等的玩家以及具有属性名称和 ID 的 PositionId、Position。 如果我想通过普通 PositionController 访问一个位置,它工作得很好,但是当我尝试使用 web api 访问一个位置时,它会返回与该位置连接的所有对象。

例如,我想用 url 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);
}

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

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;

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

api/职位API/1

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

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);
    }

希望有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM