我决定覆盖ASP.NET身份AddToRoleAsync
的{{1}}方法。
发件人:
UserManager
要
public override Task<IdentityResult> AddToRoleAsync(long userId, string role)
{
return base.AddToRoleAsync(userId, role);
}
但是在调试过程中,当程序进入 // I added async keyword
public override async Task<IdentityResult> AddToRoleAsync(long userId, string role)
{
// Adding the await keyword here
var result = await base.AddToRoleAsync(userId, role); // << It causes the error
// Calling my appropriate Task method
await UpdatePermissionsAsync(userId);
return result;
}
时,它不会继续到下一行代码,当我按下await base.AddToRoleAsync(userId, role)
时,它会返回此错误:
System.InvalidOperationException:异步模块或处理程序 在异步操作仍未完成时完成。
我很困惑,因为我在返回F5
的方法之前使用了await
关键字,但我仍然收到错误!
我应该如何覆盖它?
更新
通过以下@StephenCleary的提示,我在父方法的签名中找到Task
,该方法调用了代码,但在调用者父方法中本身没有async void
。所以上面的问题解决了但现在它给我带来了新问题!因为在这种情况下,root方法是 await
,并且它不应该有OnAuthorization
关键字(它会导致错误)。
所以我应该在
async
内部运行async
方法 OnAuthorization 方法! 如何吗
答案 0 :(得分:3)
正如我在async
ASP.NET的文章中所述,此错误通常是由async void
方法引起的。使用async void
时,没有返回Task
,因此您的代码无法await
完成。
在您的特定情况下(OnAuthorization
),遗憾的是,没有办法异步执行此操作。同样在我的async
ASP.NET文章中,我描述了经典ASP.NET中async
支持的两个限制:动作过滤器和子动作。在经典ASP.NET中无法安全地创建这两个async
。 (ASP.NET Core允许async
过滤器和视图组件)。在这种情况下,OnAuthorization
是一个操作过滤器,因此不能是async
。
唯一的解决方案是升级到ASP.NET Core并使用async
操作过滤器,或者使过滤器同步。我建议将所有代码同步,但也可以使用some form of sync-over-async。