c# - SQL 写入 ASP.NET 用户表不保存

标签 c# asp.net sql-server azure asp.net-web-api

我的设置:

  • 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/

相关文章:

sql - SSIS - 将文件动态移动到具有匹配子字符串名称的文件夹

c# - 如何识别查询语句中有子查询?

c# - 正在尝试将 .png 文件上传到 Web 目录

sql-server - SQL Server 批量插入访问问题

c# - 从 html 文档中获取值

c# - 如何从SQL Server表中下载并查看图像?

asp.net - Firefox 上的 CompareValidator 问题

asp.net - 在 View Mvc.net中访问路由值

c# - 为 WPF DateTimePicker 验证设置区域性

c# - 使用 SSL 通过 .Net DirectoryServices 连接到 LDAP