You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:45:28