Я использую Entity Framework для работы с пользователями в моем приложении .NET. Проблема, которая у меня сейчас возникла, заключается в том, что если несколько пользователей делают один и тот же запрос одновременно, сервер возвращает пользователям неверные данные, они путаются.
От чего Я читал, скорее всего, это проблема параллелизма, но пока не нашел правильного решения. Раньше я добавлял ведение журнала, просто чтобы посмотреть, что вызывает проблему, и если бы я сделал 2 запроса в этой конечной точке одновременно, вместо того, чтобы иметь 2 журнала с 2 разными идентификаторами пользователей, сохранялся только 1, а также пользователи были смешанными. снова.
Как правильно это исправить? Даже пробовал чатгпты с пессимистическим параллелизмом, но в моем случае это не помогло.
Контроллер:
[Authorize]
[HttpGet]
public async Task GetUserDetails()
{
try
{
int userId = User.Identity.GetUserId();
var result = await _functionsService.GetUserDetails(userId);
if (result == null)
{
return Json(new { success = false, message = "User not found" }, JsonRequestBehavior.AllowGet);
}
return Json(new { success = true, data = result }, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
// Log the exception (ex) here as needed
return Json(new { success = false, message = "An error occurred while processing your request." }, JsonRequestBehavior.AllowGet);
}
}
Сервис:
public async Task GetUserDetails(int userId)
{
var logEntry = new UserRequestLog
{
UserId = userId.ToString(),
RequestType = "GetUserDetails",
RequestData = $"{{ \"userId\": {userId} }}",
Timestamp = DateTime.UtcNow,
IpAddress = GetIpAddress(),
UserAgent = GetUserAgent()
};
try
{
var user = await _context.AspNetUsers
.Where(u => u.Id == userId)
.Select(u => new UserDetails
{
FirstName = u.Firstname,
LastName = u.Lastname,
PhoneNumber = u.PhoneNumber,
Email = u.Email,
Address = u.Address,
Country = u.Country,
OwnershipType = u.DropdownOwnershipType != null ? u.DropdownOwnershipType.Type : null,
AccountType = u.DropdownAccountType != null ? u.DropdownAccountType.Type : null,
DateOfBirth = u.DateOfBirth ?? default(DateTime), // Handle nullable DateTime
basicStatusId = u.BasicStatusId
})
.FirstOrDefaultAsync();
logEntry.ResponseStatus = "Success";
logEntry.ResponseData = $"{{ \"user\": {JsonConvert.SerializeObject(user)} }}";
return user;
}
catch (Exception ex)
{
logEntry.ResponseStatus = "Error";
logEntry.ResponseData = $"{{ \"error\": \"{ex.Message}\" }}";
// Optionally, rethrow or handle the exception
throw;
}
finally
{
_context.UserRequestLogs.Add(logEntry);
await _context.SaveChangesAsync();
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... pplication
Условия гонки в приложении .NET ⇐ C#
Место общения программистов C#
1727686975
Anonymous
Я использую Entity Framework для работы с пользователями в моем приложении .NET. Проблема, которая у меня сейчас возникла, заключается в том, что если несколько пользователей делают один и тот же запрос одновременно, сервер возвращает пользователям неверные данные, они путаются.
От чего Я читал, скорее всего, это проблема параллелизма, но пока не нашел правильного решения. Раньше я добавлял ведение журнала, просто чтобы посмотреть, что вызывает проблему, и если бы я сделал 2 запроса в этой конечной точке одновременно, вместо того, чтобы иметь 2 журнала с 2 разными идентификаторами пользователей, сохранялся только 1, а также пользователи были смешанными. снова.
Как правильно это исправить? Даже пробовал чатгпты с пессимистическим параллелизмом, но в моем случае это не помогло.
Контроллер:
[Authorize]
[HttpGet]
public async Task GetUserDetails()
{
try
{
int userId = User.Identity.GetUserId();
var result = await _functionsService.GetUserDetails(userId);
if (result == null)
{
return Json(new { success = false, message = "User not found" }, JsonRequestBehavior.AllowGet);
}
return Json(new { success = true, data = result }, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
// Log the exception (ex) here as needed
return Json(new { success = false, message = "An error occurred while processing your request." }, JsonRequestBehavior.AllowGet);
}
}
Сервис:
public async Task GetUserDetails(int userId)
{
var logEntry = new UserRequestLog
{
UserId = userId.ToString(),
RequestType = "GetUserDetails",
RequestData = $"{{ \"userId\": {userId} }}",
Timestamp = DateTime.UtcNow,
IpAddress = GetIpAddress(),
UserAgent = GetUserAgent()
};
try
{
var user = await _context.AspNetUsers
.Where(u => u.Id == userId)
.Select(u => new UserDetails
{
FirstName = u.Firstname,
LastName = u.Lastname,
PhoneNumber = u.PhoneNumber,
Email = u.Email,
Address = u.Address,
Country = u.Country,
OwnershipType = u.DropdownOwnershipType != null ? u.DropdownOwnershipType.Type : null,
AccountType = u.DropdownAccountType != null ? u.DropdownAccountType.Type : null,
DateOfBirth = u.DateOfBirth ?? default(DateTime), // Handle nullable DateTime
basicStatusId = u.BasicStatusId
})
.FirstOrDefaultAsync();
logEntry.ResponseStatus = "Success";
logEntry.ResponseData = $"{{ \"user\": {JsonConvert.SerializeObject(user)} }}";
return user;
}
catch (Exception ex)
{
logEntry.ResponseStatus = "Error";
logEntry.ResponseData = $"{{ \"error\": \"{ex.Message}\" }}";
// Optionally, rethrow or handle the exception
throw;
}
finally
{
_context.UserRequestLogs.Add(logEntry);
await _context.SaveChangesAsync();
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79034175/race-conditions-in-net-application[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия