重写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
, 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);
}
}