Я искал подходящее направление для проверки наличия записи для входа в базу данных. Мои намерения заключаются в том, чтобы, когда учетные данные пользователя поступают со страницы входа, использовать имя пользователя и пароль и проверять, существует ли он с помощью async.
public async Task<ActionResult<ResultsDTO<LoginDTO>>> PostLogin(LoginFormDTO login)
{
ResultsDTO<LoginFormDTO> output = new ResultDTO<LoginForFoDTO>();
if (!ModelState.IsValid)
{
output.Success = false;
output.SetValidations(ModelState);
}
LoginFormDTO loginFormDTO = null;
try
{
string encryptedPassword = encryptmystuff(login.pw);
// validate login
log logUser = _context.log.SingleOrDefault(m => m.name == login.Username && m.password == encryptedPassword);
}
catch
{
}
}
P.S. если вы просто собираетесь await
вызвать SingleOrDefaultAsync()
, то вы можете просто использовать SingleOrDefault()
- ожидая его, вы фактически снова сделали его синхронным
@ADyson ADyson не запустится, но сейчас я пробую ваше решение.
«не запускается» не является сообщением об ошибке или описанием проблемы. Пожалуйста, предоставьте нам подробную информацию об ошибке. И мое предложение не решит вашу проблему, я просто указал, что использование асинхронности здесь было пустой тратой времени, если вы на самом деле не собираетесь делать что-то еще во время работы асинхронного кода.
@ADyson ошибка: отсутствует «идентификатор».
log loginUser = await _context.log .SingleOrDefault(m => m.name == login.Username && m.password == зашифрованный пароль);
вам больше не нужно await
, потому что вызов метода больше не является асинхронным. Вероятно, вам стоит больше узнать об async/await, судя по всему.
Что касается ошибки, не могли бы вы показать полное сообщение об ошибке (и трассировку стека, если вы считаете, что это потенциально важно) и указать строку, в которой она возникает. И, пожалуйста, добавьте это к своему вопросу, чтобы все это заметили. Спасибо.
Я сделал обновление.
Хорошо, спасибо, но меня действительно гораздо больше интересует твоя ошибка. Асинхронная вещь была просто в стороне
Код серьезности Описание Ошибка состояния подавления строки файла проекта CS1061 'log' не содержит определения для 'GetAwaiter', и не удалось найти доступный метод расширения 'GetAwaiter', принимающий первый аргумент типа 'log' (вы пропустили директиву использования или ссылка на сборку?) Portal.API
а к какой строке это относится? P.S. Я попросил вас добавить эти детали в вопрос, а не в комментарии :-)
@ADyson log logUser = _context.log.SingleOrDefault(m => m.name == login.Username && m.password == зашифрованный пароль);
и это та же ошибка, даже после того, как вы изменили его на то, что я предложил? Вы получили эту ошибку до, вы изменили ее? Или какая-то другая ошибка? Неясно.
Когда я удаляю await все вместе, он работает хорошо
Вам просто нужно изменить эту строку
log logUser = _context.log.SingleOrDefault(m =>
m.name == login.Username && m.password == encryptedPassword);
к
log logUser = await _context.log.SingleOrDefaultAsync(m =>
m.name == login.Username && m.password == encryptedPassword);
// return failure if logUser is null
Это использует async/await
, который будет синхронно выполнять ваш код, но не будет блокировать поток, пока выполняется ваш запрос к БД.
С другой стороны, если вы используете SingleOrDefault()
, то вы блокируете поток во время работы БД, что не является хорошей практикой.
и с какой проблемой вы столкнулись с этим кодом до сих пор?