调用API时如何移除响应体中多余的Task属性?
问题描述
调用API时,如何移除响应体中返回的多余Task属性?
TokenHandler代码
public Task CreateAdminTokenAsync(Admin admin) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:Key"])); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); //创建Claims var claims = new List<Claim>(); claims.Add(new Claim(ClaimTypes.GivenName, admin.Name)); claims.Add(new Claim(ClaimTypes.Email, admin.Email)); claims.Add(new Claim(ClaimsIdentity.DefaultRoleClaimType, "Admin")); var token = new JwtSecurityToken( configuration["Jwt:Issuer"], configuration["Jwt:Audience"], claims, expires: DateTime.Now.AddMinutes(15), signingCredentials: credentials); return Task.FromResult(new JwtSecurityTokenHandler().WriteToken(token)); }
控制器代码
public async Task AdminLoginAsync(Models.DTOs.LoginRequest loginRequest) { //检查用户名和密码 var user = await adminRepository.AuthenticateAdminAsync(loginRequest.Username, loginRequest.Password); if (user != null) { //生成JWT令牌并返回 var token = tokenHandler.CreateAdminTokenAsync(user); return Ok((token)); } return BadRequest("Username or Password is Incorrect."); }
当前输出结果
{ "result": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9naXZlbm5hbWUiOiJOYW5kaW5pIFRyaXBhdGh5IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvZW1haWxhZGRyZXNzIjoibmFuZGluaXRyaXBhdGh5MTk5OUBnbWFpbC5jb20iLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJQYXNzZW5nZXIiLCJleHAiOjE2NjYwNzI3ODksImlzcyI6Imh0dHBzOi8vbG9jYWxob3N0OjcwNTQvIiwiYXVkIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NzA1NC8ifQ.HltuOc9KYTJaxKjs4s7OXQWwPcLjMCP3-J4SS3YPfAI", "id": 1, "exception": null, "status": 5, "isCanceled": false, "isCompleted": true, "isCompletedSuccessfully": true, "creationOptions": 0, "asyncState": null, "isFaulted": false }
期望输出结果
{ "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9naXZlbm5hbWUiOiJOYW5kaW5pIFRyaXBhdGh5IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvZW1haWxhZGRyZXNzIjoibmFuZGluaXRyaXBhdGh5MTk5OUBnbWFpbC5jb20iLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJQYXNzZW5nZXIiLCJleHAiOjE2NjYwNzI3ODksImlzcyI6Imh0dHBzOi8vbG9jYWxob3N0OjcwNTQvIiwiYXVkIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NzA1NC8ifQ.HltuOc9KYTJaxKjs4s7OXQWwPcLjMCP3-J4SS3YPfAI" }
解决方案
出现多余Task属性的核心原因是未正确等待异步方法执行完成,直接返回了Task对象而非实际的令牌字符串,同时方法返回类型不够明确。按以下步骤修改:
1. 修正TokenHandler方法的返回类型
将CreateAdminTokenAsync的返回类型从Task改为Task<string>,明确返回的是字符串类型的异步任务:
public Task<string> CreateAdminTokenAsync(Admin admin) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:Key"])); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var claims = new List<Claim>(); claims.Add(new Claim(ClaimTypes.GivenName, admin.Name)); claims.Add(new Claim(ClaimTypes.Email, admin.Email)); claims.Add(new Claim(ClaimsIdentity.DefaultRoleClaimType, "Admin")); var token = new JwtSecurityToken( configuration["Jwt:Issuer"], configuration["Jwt:Audience"], claims, expires: DateTime.Now.AddMinutes(15), signingCredentials: credentials); return Task.FromResult(new JwtSecurityTokenHandler().WriteToken(token)); }
2. 在控制器中等待异步方法完成
调用CreateAdminTokenAsync时加上await关键字,获取实际的令牌字符串而非Task对象,同时修正控制器方法的返回类型以符合ASP.NET Core规范:
public async Task<IActionResult> AdminLoginAsync(Models.DTOs.LoginRequest loginRequest) { var user = await adminRepository.AuthenticateAdminAsync(loginRequest.Username, loginRequest.Password); if (user != null) { var token = await tokenHandler.CreateAdminTokenAsync(user); // 若要返回符合期望格式的内容(注意期望输出JSON存在语法问题,此处返回带引号的纯字符串) return Content($"\"{token}\"", "application/json"); // 若需标准JSON格式,可改为:return Ok(new { Token = token }); } return BadRequest("用户名或密码错误。"); }
说明
- 原控制器方法返回类型未指定具体的IActionResult,修正后更符合ASP.NET Core控制器开发规范。
- 期望输出的JSON存在语法错误(键未加引号),实际开发中建议返回标准JSON结构,便于前端解析。
内容的提问来源于stack exchange,提问作者Deepsubho Gayen
相关产品推荐
相关产品推荐

