Метод CreateAsync не выдает ошибку и не обновляет базу данных - PullRequest
1 голос
/ 03 мая 2019

У меня есть следующий простой код для создания нового пользователя с использованием метода 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 });
    }   
}

Метод Register вызывается из интерфейса React.

1 Ответ

7 голосов
/ 03 мая 2019

Вы никогда не ожидали своего асинхронного вызова.Поэтому он может даже не завершиться к тому времени, когда ваш результат действия вернется, и, следовательно, может никогда не запуститься.Убедитесь, что вы ожидаете любых асинхронных вызовов.Это означает, что вызывающий метод должен быть помечен как асинхронный (и сделан для возврата Задачи или Задачи), вплоть до стека вызовов, пока он не достигнет обработчика событий или кода структуры.Вот как должен выглядеть ваш код:

[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 });
    }   
}

Также обратите внимание, что возвращать подробности исключений пользователю клиента - плохая идея.Исключения могут содержать конфиденциальную информацию, которую злоумышленник может использовать для использования вашей системы.Вместо этого просто верните универсальное сообщение «Извините, что-то пошло не так» и запишите сведения об исключении в вашу среду ведения журнала.Если у вас нет каркаса логов, получите его.

...