我有一个Angular 6应用程序,该应用程序调用使用EF Core的Web API控制器。默认情况下,EF Core不会加载外部实体(可能是延迟加载吗?),因此根据以下建议,我使用了以下代码来包含此类实体:
var members = await _context.Person.Include(x => x.PersonNavigation).Where(x => x.DepartmentId == id).ToListAsync();
问题是,当控制器返回 members 成员时,它将发送以下标头:
传输编码:分块
使结果/数据无法被Angular应用程序读取(我想是可以预料的,因为响应是分块的)。
有什么建议吗? Web API是否遵循此标准行为?我该怎么做才能返回可行的JSON?
谢谢
根据约翰尼5的要求编辑#1:
API控制器:
public async Task<IActionResult> GetDepartmentMembers([FromRoute] int id)
{
var members = await _context.Person.Include(x => x.PersonNavigation).Where(x => x.DepartmentId == id).ToListAsync();
if (members == null) { return NotFound(); }
return Ok(members);
}
Angular服务:
getDepartmentMembers(departmentId: number): Observable<Person[]> {
return this.http.get<Person[]>('http://localhost:49659/api/departments/' + departmentId + '/members');
}
角度组件:
getDepartmentMembers(departmentId: number) {
this.departmentService.getDepartmentMembers(departmentId).subscribe(data => {
this.departmentMembers = data;
});
}
响应标题:
答案 0 :(得分:0)
只是一个猜测,因为您没有提出错误,所以您没有返回正确的json,尤其是在404情况下,我对执行此操作的方式并不十分熟悉,但是通常您会只需返回人员列表
我什至不知道您为什么要仅仅因为部门没有人而要404,而不是仅仅返回一个空列表。
Id首先通过将您的代码更改为如下形式进行验证:
public async Task<List<Person>> GetDepartmentMembers([FromRoute] int id)
{
return await _context.Person.Include(x => x.PersonNavigation).Where(x => x.DepartmentId == id).ToListAsync();
}
如果这行得通,那似乎是您处理NotFound响应的方式,那么您可以修改代码以使用全局错误处理程序。
通常我会创建一个自定义异常,例如InvalidId来处理我的404等等。
public async Task<List<Person>> GetDepartmentMembers([FromRoute] int id)
{
var members = await _context.Person.Include(x => x.PersonNavigation).Where(x => x.DepartmentId == id).ToListAsync();
if (members == null) {
throw new InvalidId();
}
return members;
}
然后,您需要创建一个全局错误处理程序来处理无效的id异常