我的设置:
- ASP.NET 4.5 Web API(在 Azure 上)将数据保存到 SQL 数据库(也在 Azure 上)
- AngularJS Web 前端(另一个 Azure 网站)
当用户第一次注册时,我向他们展示“入门介绍”。该介绍只应该运行一次 - 我将介绍启动日期的时间戳记录为 ASP.NET 用户表中的自定义字段。
想象一下,当我登录(就像用户一样)并看到两次简介时,我会感到多么惊讶。
AngularJS 前端正确地将“介绍已查看”消息发送到 ASP.NET api,并且 api 响应成功消息。但是,当我查看数据库中的原始数据时,时间戳绝对没有更新。因此,用户将第二次看到简介(此时时间戳将正确记录在数据库中)。
我有一个蹩脚的解决方法。客户端从我的服务器请求 OAuth 承载 token 后,客户端会请求用户信息(以决定是否显示游览)。 等待 100 毫秒,然后将“游览已查看”消息发送回服务器会掩盖问题。
我在任何时候都没有发现任何其他存储数据的问题。因为我们的数据库位于 Azure 上,所以我无法连接 Profiler 和 built in auditing没有给我任何线索。
请求 token 是否会导致 ASP.NET 身份处于一种有趣的状态?并且需要短暂的等待才能写入表?扩展基本身份设置的自定义字段是否容易出现此类问题? UserManager 是否可能在其黑匣子中做了一些奇怪的事情?
有人对如何继续调试此问题有建议吗?或者听说过类似的事情吗?
以下是应更新数据库中的“游览查看”时间戳的相关代码:
[HttpPost, Route("UserInfo")]
public async Task<IHttpActionResult> UpdateUserInfo(UpdateBindingModel model)
{
var currentUser = UserManager.FindById(User.Identity.GetUserId());
if (model.FirstName != null)
{
currentUser.FirstName = model.FirstName;
}
if (model.LastName != null)
{
currentUser.LastName = model.LastName;
}
if (model.SetIntroViewCompleteDate)
{
currentUser.IntroViewCompleteDate = DateTime.UtcNow;
}
if (model.SetIntroViewLaunchDate)
{
currentUser.IntroViewLaunchDate = DateTime.UtcNow;
}
if (model.SetTipTourCompleteDate)
{
currentUser.TipTourCompleteDate = DateTime.UtcNow;
}
if (model.SetTipTourLaunchDate)
{
currentUser.TipTourLaunchDate = DateTime.UtcNow;
}
IdentityResult result = await UserManager.UpdateAsync(currentUser);
if (result.Succeeded)
{
var data = new UserInfoViewModel
{
FirstName = currentUser.FirstName,
LastName = currentUser.LastName,
IntroViewLaunchDate = currentUser.IntroViewLaunchDate
};
return Ok(data);
}
return InternalServerError();
}
更新 ********* 4/18
我还尝试完全摆脱 UserManager 的东西。我已经尝试了以下修改(从表中提取用户数据,就像访问任何其他数据一样),但它的行为仍然相同。我开始认为将自定义字段放在 ApplicationUser 对象上是一个坏主意......
新的数据库检索和保存如下所示:
ApplicationDbContext newContext = new ApplicationDbContext();
var currentUser = await (from c in newContext.Users
where c.Email == User.Identity.Name
select c).SingleOrDefaultAsync();
//update some values
await newContext.SaveChangesAsync();
最佳答案
基本上,问题可能在于“UserManager”的初始化以及此类在数据库上下文上工作的事实,因此您需要保留对该上下文的更改。这是一个例子:
var userStore = new UserStore<ApplicationUser>(new MyDbContext());
var userManager = new UserManager(userStore);
这样您就可以记住经理和上下文。然后在你的方法中你通常会调用:
IdentityResult result = await userManager.UpdateAsync(currentUser);
然后将此更改保留到数据库上下文:
var dbContext = userStore.context;
dbContext.saveChanges();
关于c# - SQL 写入 ASP.NET 用户表不保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36611725/