ASP.NET身份的自定义实现

时间:2016-04-12 11:05:58

标签: c# async-await task asp.net-web-api2 identity

我正在使用各种资源来尝试使用MS Access为AngularJS应用程序实现身份系统。 我创建了实现我需要的Identity接口的类,并且我一直处于创建帐户控制器的阶段(这将是用于注册,登录等的API)。

班级UserStore实施IUserStore并使用CreateAsync方法:

public Task CreateAsync(TUser user)
{
    if (user == null)
    {
        throw new ArgumentNullException("user");
    }

    var result = userTable.Insert(user);

    return Task.FromResult(result);
} 

AccountController实施ApiController并使用Register方法:

[AllowAnonymous]
[Route("register")]
public async Task<IHttpActionResult> Register(IdentityUser user)
{
    var result = await _userStore.CreateAsync(user);

    if (result == 0)
    {
        return InternalServerError();
    }

    return Ok();
}

userTable.Insert(user)返回int,表示数据库表中受影响的行数。第var result = await _userStore.CreateAsync(user);行会引发错误,说它实际返回void,因此无法将void分配给var(或其他任何内容)。

我很难理解如何编写Register方法和CreateAsync方法,以便它们能够协同工作。

顺便说一句,我认为我应该放弃整个async的事情,只是让CreateAsyncRegister按原样返回int值,但我不能这样做,因为{ {1}}实现了'IUserStore'。

1 个答案:

答案 0 :(得分:1)

问题是返回类型无法从CreateAsync传递,因为它只是Task返回。它需要Task<int>但是你不能这样做,因为它实现了IUserStore接口。为什么你需要结果,我假设你没有?

请改为尝试:

[AllowAnonymous]
[Route("register")]
public async Task<IHttpActionResult> Register(IdentityUser user)
{
    await _userStore.CreateAsync(user);
    return Ok();
}

此外,如果可能,请考虑拨打userTable.Insert(user) async电话。

我建议不要放弃async/await。特别是对于像这样的网站上的I / O绑定操作,它们确实使您的应用程序可用。

如果您真的担心插入内容是否有问题,请尝试以下方法:

public async Task CreateAsync(TUser user)
{
    if (user == null)
    {
        throw new ArgumentNullException("user");
    }

    var existingUser = await this.FindByIdAsync(user.Id);
    if (existingUser != null)
    {
        await this.UpdateAsync(user);
    }
    else
    {
        userTable.Insert(user);
    }
}