Я использую 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