[英]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.