FindByNameAsync выбрасывает нулевое исключение - PullRequest
0 голосов
/ 22 октября 2019

В настоящее время мое приложение, являющееся основным приложением asp.net, проверяет пользователя по userEmail, которое теперь необходимо изменить, чтобы проверить его по userName. Я изменил метод FindByNameAsync из FindByEmailAsync. Это работает, если я ввожу адрес электронной почты, но если я использую имя пользователя, это не работает. Выдает нулевое исключение для response.Result.UserName Может кто-нибудь сказать мне, в чем может быть проблема

public async Task<SignInResult> PasswordSignInAsync(string user, string password, bool isPersistent, bool lockoutOnFailure)
        {
            var userName = GetUserName(user);
            return await _signInManager.PasswordSignInAsync(userName, password, isPersistent, lockoutOnFailure);
        }

 private string GetUserName(string userName)
        {
            //if (!userNameOrEmail.Contains("@"))
            //    return userNameOrEmail;

            var response = _userManager.FindByNameAsync(userName);

            return response.Result != null ? response.Result.UserName : string.Empty;
        }

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Во-первых, не блокируйте асинхронные задачи. Вы находитесь в асинхронном методе, поэтому нет никаких оснований не ожидать результата:

private async Task<string> GetUserNameAsync(string userName)
{
    var response = await _userManager.FindByNameAsync(userName);
    return response?.UserName ?? string.Empty;
}

Тогда:

var userName = await GetUserNameAsync(user);

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

public async Task<bool> UserNameExistsAsync(string userName)
{
    return await _userManager.FindByNameAsync(userName) != null;
}

Тогда:

if (await UserNameExistsAsync(user))
{
    // do something
}

И, собственно, было бы лучше , чтобы использовать контекст прямо здесь, но для этого может потребоваться дополнительная зависимость:

var userNameExists = await _context.Users.AnyAsync(x => x.UserName == user);

Независимо от этого источник вашей проблемы заключается в том, что когда приходит время вызвать PasswordSignInAsync, значение, которое вы передаете для userName, может бытьпустая строка, которая не является допустимым значением для этого параметра. Заключение этого вызова в условное выражение решило бы проблему, так что вы выполняете его, только если пользователь действительно существует.

0 голосов
/ 22 октября 2019

Вы должны ожидать асинхронных вызовов для получения результатов:

var response = await _userManager.FindByNameAsync(userName);

Также вам нужно будет украсить функцию GetUserName с помощью async

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...