如何使用EF Core处理ASP.NET Core 2.0分块式Web Api调用

时间:2018-07-09 19:58:44

标签: angular asp.net-web-api asp.net-core entity-framework-core asp.net-core-2.0

我有一个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;
});
}

响应标题:

enter image description here

1 个答案:

答案 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异常

相关问题