重写async方法,并对结果进行异常处理

本文关键字:结果 异常处理 async 方法 重写 | 更新日期: 2023-09-27 18:03:37

我遇到困难的方法之一是:

if (ModelState.IsValid)
{
    var user = new User { UserName = model.Email, Email = model.Email };
    IdentityResult result = null;
    try
    {
        result = await this._userManager.CreateAsync(user, model.Password).Result;
    }
    catch (Exception ex)
    {
    }
    if (result != null && result.Succeeded)
    {
      // not important code
    }
    AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);

我相信CreateAsync(TUser user, string passwor)方法(Microsoft.AspNet)中有一个bug。Identity, Microsoft.AspNet.IdentityCore.dll, v2.0.0.0)。如果我用密码验证器配置用户管理器并且密码不验证,则没有例外(好路径)并且IdentityResult看起来像

Errors      {string[1]}
- string[]  {string[1]}
-- [0]      "Passwords must have at least...."

然而,如果传入一个现有的用户,而不是一个好的IdentityResult,该方法抛出一个EntityValidationErrors异常(坏路径)。我想把上面的代码放回原始代码,而不使用try catch,并真正依赖于IdentityResult:

if (ModelState.IsValid)
{
    var user = new User { UserName = model.Email, Email = model.Email };
    var result = this._userManager.CreateAsync(user, model.Password);
    if (result.Succeeded)
    {
      // not important code
    }
    AddErrors(result);
}

重写CreateAsync()方法:

public override Task<IdentityResult> CreateAsync(User user, string password)
{
    Task<IdentityResult> result = null;
    try
    {
        var ir = base.CreateAsync(user, password);
        return ??;
    }
    catch (DbEntityValidationException ex)
    {
        var errors = ex.EntityValidationErrors
            .Where(e => e.IsValid)
            .SelectMany(e => e.ValidationErrors)
            .Select(e => e.ErrorMessage)
            .ToArray();
        var ir = new IdentityResult(errors);
        return ??;
    }
    return result;
}

然而,我根本不知道如何返回任务,也不知道这是否是解决问题的正确方向。

我想我可以这样做,但使用另一个线程,只会返回一个值,似乎绝对错误的路线。

result = Task.Factory.StartNew(() =>
{
  return ir;
});

重写async方法,并对结果进行异常处理

只需将您的方法async, await设置为所讨论的任务,然后只需在catch子句中返回替代值。

public override async Task<IdentityResult> CreateAsync(User user, string password)
{
    try
    {
        return await base.CreateAsync(user, password);
    }
    catch (DbEntityValidationException ex)
    {
        var errors = ex.EntityValidationErrors
            .Where(e => e.IsValid)
            .SelectMany(e => e.ValidationErrors)
            .Select(e => e.ErrorMessage)
            .ToArray();
        return new IdentityResult(errors);
    }
}