System.NotSupportedException: 不支持对 'System.Action' 实例进行序列化和反序列化。路径:$.MoveNextAction

14

我正在跟随一个关于.NET 6的简单教程,它应该非常简单,但显然我遇到了异常。示例代码如下:

public async Task<ServiceResponse<List<GetCharacterDto>>> GetAllCharacters()
{
    var response = new ServiceResponse<List<GetCharacterDto>>();
    var dbCharacters = await _context.Characters.ToListAsync();
    response.Data = dbCharacters.Select(c => _mapper.Map<GetCharacterDto>(c)).ToList();

    return response;
}

GetCharacterDto 中的代码如下:

public class GetCharacterDto
{ 
    public int Id { get; set; }
    
    public string Name { get; set; } = "Frodo";

    public int HitPoints { get; set; } = 100;

    public int Strength { get; set; } = 10;

    public int Defense { get; set; } = 10;

    public int Intelligence { get; set; } = 10;

    public RpgClass Class { get; set; } = RpgClass.Knight;
}

Rpg类:

[JsonConverter(typeof(JsonStringEnumConverter))]
public enum RpgClass
{
    Knight = 1,
    Mage = 2,
    Cleric = 3
}

异常

System.NotSupportedException: 不支持对 'System.Action' 实例进行序列化和反序列化。路径:$.MoveNextAction。 在此处抛出。

var dbCharacters = await _context.Characters.ToListAsync(); 

如果我同步调用它。
_context.Characters.ToList();

它可以正常工作,但无法异步工作。

我已经安装了.NET 5 SDK和.NET 6 SDK,如果这可能是一个潜在的问题。


RpgClass 是一个枚举类型。 - vpp090
5
问题不在这里……你可能在控制器中有 results = GetAllCharacters(); return results; 这段代码。它可以在同步模式下工作,但在异步模式下会出现这些症状。 - Selvin
@Selvin -- 天才。我也遇到了同样的问题,不知何故智能感应没有给出错误提示,但这是关键! - gotmike
@Selvin,你应该把这个作为一个答案,它似乎引起了注意。- 这个救了我的一天。我在调用堆栈中忘记了一个await,奇怪的是,一个HttpClient.GetAsync()调用失败,并显示了这个错误信息 - 但只是第一个调用,其他的调用都完成了(在那个时候,控制器已经向其客户端返回了一个错误,我本可以猜到的)。谢谢! - undefined
3个回答

57

我在调用GetAllCharacters()方法的控制器中缺少了一个await


1
[HttpGet("Info")]
[Authorize]
public async Task<ActionResult<UserDto>> GetCurrentUserInfo()
{
    var user = await _userService.GetCurrentUserInfo();
    return user.ToDto();
}

请移除“OK”,直接返回


0

我在一个没有参数的服务任务中遇到了这个问题,当我试图调用它时。 当我添加了一个参数后,它可以工作,但这只是一个权宜之计。 我认为有更好的方法来解决它,但我不知道该怎么做。

[HttpGet("Info")]
[Authorize]
public async Task<ActionResult<UserDto>> GetCurrentUserInfo()
{
    var user = await _userService.GetCurrentUserInfo();
    return Ok(user.ToDto());
}

我刚刚添加了一个参数,它起作用了

[HttpGet("Info")]
[Authorize]
public async Task<ActionResult<UserDto>> GetCurrentUserInfo()
{
    var user = await _userService.GetCurrentUserInfo("0");
    return Ok(user.ToDto());
}

如果有更好的方法,请告诉我,非常感谢。

我刚意识到用户服务方法和控制器方法有相同的名称,当两个方法具有相同的签名时,会导致以下错误: System.NotSupportedException:不支持“System.Action”实例的序列化和反序列化。路径:$ .MoveNextAction 只需更改方法名称即可解决问题,如果您遇到了相同的问题。 - Omar
3
请将您的评论中的信息编辑并移至答案中,确保整个内容都是回答本页面顶部的问题并符合 [answer] 的规定,而不是您在解决类似但不同问题时的经验和解决方案。因为您当前发布的帖子和评论给人的印象就是这样的。 - Yunnosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接