Условия гонки в приложении .netC#

Место общения программистов C#
Ответить
Anonymous
 Условия гонки в приложении .net

Сообщение Anonymous »

Я использую платформу сущностей для работы с пользователями в своем .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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»