Identity Framework中是否有GetUserIdAsync()?

时间:2015-03-03 11:07:53

标签: c# asp.net-mvc razor asynchronous asp.net-identity

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

  

第二个操作在此前一个上下文之前开始   异步操作完成。使用'await'确保任何   在调用另一个方法之前已完成异步操作   在这种背景下。任何实例成员都不能保证是线程   安全

所以我开始使用使用异步方法来处理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()在幕后运行async

我假设,因为它是一个MS lib,会有一个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;
    }

1 个答案:

答案 0 :(得分:1)

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

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