Identity Framework中是否存在GetUserIdAsync()



最初我在MVC Razor应用程序中遇到了以下错误(在完成页面加载之前单击某些选项两次):

在上一个操作之前在此上下文上启动了第二个操作异步操作已完成。使用"等待"确保异步操作在调用另一个方法之前已完成在此背景下。任何实例成员都不能保证是线程安全

因此,我开始按照MS的建议使用异步方法。这涉及到在多个控制器操作中级联异步更改(实现async在传播方式上被比作"僵尸病毒",我倾向于同意这一点)。

在注入的CurrentCandidate类中,以下异步方法仍然会出现错误:

    public async Task<ApplicationUser> ApplicationUserAsync()
    {
        var applicationUser = await this._userManager.FindByIdAsync(HttpContext.Current.User.Identity.GetUserId());
        return applicationUser;
    }

这可能是因为HttpContext.Current.User.Identity.GetUserId()在后台运行异步

我假设,由于它是一个MS库,会有一个异步版本的GetUserId(),但我找不到一个(或任何文档表明它存在)

我有什么选择?我受到了一位同事的一些压力,要求我完全放弃async方法,但这只会在另一个地方导致同样的错误。

建议?

更新:

将两个调用分隔成单独的行,可以得到更清晰的画面。崩溃发生在FindByIdAsync():上

    public async Task<ApplicationUser> ApplicationUserAsync()
    {
        var id = HttpContext.Current.User.Identity.GetUserId();
        var applicationUser = await this._userManager.FindByIdAsync(id); <<<< crashes here
        return applicationUser;
    }

HttpContext.Current.User.Identity.GetUserId()没有异步版本。GetUserId未连接到EF或任何异步操作。以下是源代码:https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Core/Extensions/IdentityExtensions.cs它所做的只是访问cookie数据并获取与UserId相关的声明值。

因此,您需要找到导致问题的其他操作。

最新更新