ASP.NET Core 5.0异步API端点返回有效负载外额外属性原因求解
问题原因及修复方案
根因分析
你返回的JSON中出现的exception、status、isCanceled等额外字段,都是.NET中Task<T>类型的内置公共属性。出现该问题的核心原因是控制器调用异步仓储方法时没有添加await关键字。
你代码中var users = _userRepository.GetMembersAsync();拿到的不是预期的IEnumerable<MemberDto>数据集合,而是尚未执行完成的Task<IEnumerable<MemberDto>>任务对象。ASP.NET Core序列化该Task对象时,会把它的所有公共属性都输出为JSON字段,就出现了你遇到的返回结构。
补充说明:这个问题很容易被忽略,因为
Ok()方法接受object类型的入参,直接传入Task对象不会触发编译报错。只有当你显式将users声明为IEnumerable<MemberDto>类型时,编译器才会提示缺少await关键字。
修复方法
仅需要在调用异步方法的位置添加await关键字,等待任务执行完成拿到实际返回的业务数据即可,修改后的控制器代码如下:
[HttpGet] public async Task<ActionResult<IEnumerable<MemberDto>>> GetUsers() { var users = await _userRepository.GetMembersAsync(); return Ok(users); }
修改后返回的序列化对象就是你预期的MemberDto集合,不会再出现Task相关的额外属性。
内容的提问来源于stack exchange,提问作者Nazmul Hossain
相关产品推荐
相关产品推荐

