我有一个ASP.NET MVC6应用程序。当用户在Angular中进入客户端时,我会调用ASP.NET的异步Api,在某些地方,我会调用Api 3-4次来获取其他资源。
我还在我的数据库中保留了一个用户表,与EF 6连接。在这里,当输入的用户(使用Windows Auth)不存在时,我创建一个新的用户行,并为他添加‘Public’-角色。
然而,当用户首先进入调用Api 3-4次的页面时,用户被创建了3-4次,因为“Create”没有锁定表,从而创建了用户3次。
我如何锁定表(在我的例子中是存储库),让下一次调用等待锁被移除,然后执行'GetAsync‘来检查用户是否存在?
被调用3次的代码:
var currentUserName = User.Identity.Name;
var currentUser = await _userRepository.GetAsync(u => u.UserName == currentUserName);
// Create user that does not yet exist
if (currentUser != null) return HttpBadRequest();
var user = new User(currentUserName);
using(new CreatedBySystemProvider(_userRepository))
{
_userRepository.Add(user);
await _userRepository.SaveChangesAsync();
await user.AddRoleAsync(AppSumRoles.Authenticated);
/* Temporary add SysAdmin role */
if(string.Equals(currentUserName, @"BIJTJES\NilsG", StringComparison.CurrentCultureIgnoreCase))
{
using(new CreatedBySystemProvider(_userRoleRepository))
{
await user.AddRoleAsync(AppSumRoles.SysAdmin);
}
}
currentUser = await _userRepository.GetAsync(u => u.Id == user.Id);
}
return Ok(currentUser);发布于 2016-07-15 17:11:11
考虑将CreateUser代码移到单独的应用程序接口中。用户创建应该是一个单独的用例,而不是每个其他用例的隐含部分。不要混为一谈。
发布于 2016-07-15 19:26:24
你应该考虑重构你的用户创建过程。但是对于你的问题,你可以这样做
(详情请参阅http://blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988.aspx)
private static readonly AsyncLock asyncLocker = new AsyncLock();
var currentUserName = User.Identity.Name;
using(var releaser = await asyncLocker.LockAsync())
{
var currentUser = await _userRepository.GetAsync(u => u.UserName == currentUserName);
// Create user that does not yet exist
if (currentUser != null) return HttpBadRequest();
var user = new User(currentUserName);
using(new CreatedBySystemProvider(_userRepository))
{
_userRepository.Add(user);
await _userRepository.SaveChangesAsync();
await user.AddRoleAsync(AppSumRoles.Authenticated);
/* Temporary add SysAdmin role */
if(string.Equals(currentUserName, @"BIJTJES\NilsG", StringComparison.CurrentCultureIgnoreCase))
{
using(new CreatedBySystemProvider(_userRoleRepository))
{
await user.AddRoleAsync(AppSumRoles.SysAdmin);
}
}
currentUser = await _userRepository.GetAsync(u => u.Id == user.Id);
}
}
return Ok(currentUser);https://stackoverflow.com/questions/38390073
复制相似问题