我有以下简单的代码使用CreateAsync
方法创建新用户。该代码不会引发任何错误,但是也不会更新数据库。我在IdentityResult result
行的断点处添加了一个断点,并在if
语句的断点处添加了一个断点。结果,我不知道如何调试此代码并查找错误。有帮助吗?
public async Task<IdentityResult> Create(ApplicationUser user, string password)
{
IdentityResult result = await _userManager.CreateAsync(user, password);
if (!result.Succeeded)
{
throw new AppException("Failed");
}
return result;
}
此Create
函数是从控制器调用的:
[AllowAnonymous]
[HttpPost]
[Route("api/ApplicationUser/Register")]
public IActionResult Register([FromBody]ApplicationUserDto userDto)
{
//map dto to entity
var user = _mapper.Map<ApplicationUser>(userDto);
try
{
// save
_userService.Create(user, userDto.Password);
return Ok();
}
catch (AppException ex)
{
// return error message if there was an exception
return BadRequest(new { message = ex.Message });
}
}
从React接口调用Register
方法。
答案 0 :(得分:7)
您从未等待过异步调用。因此,它甚至可能在您的操作结果返回时还没有完成,因此可能永远无法运行。确保您等待任何异步调用。这意味着调用方法需要一直标记为异步(并使其返回一个Task或Task),一直到调用堆栈为止,直到到达事件处理程序或框架代码为止。这是您的代码应如下所示:
[AllowAnonymous]
[HttpPost]
[Route("api/ApplicationUser/Register")]
public async Task<IActionResult> Register([FromBody]ApplicationUserDto userDto)
{
//map dto to entity
var user = _mapper.Map<ApplicationUser>(userDto);
try
{
// save
await _userService.Create(user, userDto.Password);
return Ok();
}
catch (AppException ex)
{
// return error message if there was an exception
return BadRequest(new { message = ex.Message });
}
}
还请注意,将异常详细信息返回给客户端用户是个坏主意。异常可能包含敏感信息,攻击者可以利用这些敏感信息来利用您的系统。相反,只需返回通用的“抱歉,出现问题”消息,并将异常详细信息记录到您的日志记录框架中。如果您没有日志记录框架,请获取一个。