草庐IT

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

coder 2024-05-27 原文

我的设置:

  • ASP.NET 4.5 web api(在 Azure 上)将数据保存到 SQL 数据库(也在 Azure 上)
  • AngularJS 网络前端(另一个 Azure 网站)

当用户首次注册时,我会向他们展示“入门介绍”。介绍只应该运行一次——我将介绍发布日期的时间戳记录为 ASP.NET 用户表中的自定义字段。

想象一下当我登录(作为用户)并看到 TWICE 介绍时我的惊讶。

AngularJS 前端正确地向 ASP.NET api 发送“intro viewed”消息,并且 api 以成功消息响应。但是,当我查看数据库中的原始数据时,时间戳绝对没有更新。因此,用户将第二次看到介绍(此时时间戳被正确记录在数据库中)。

我有一个蹩脚的解决方法。客户端从我的服务器请求 OAuth Bearer token 后,客户端会请求用户信息(以决定是否显示游览)。 等待 100 毫秒,然后将“tour viewed”消息发送回服务器掩盖了这个问题。

我在任何时候都没有看到存储数据的任何其他问题。因为我们的数据库在 Azure 上,所以我无法连接 Profiler 和 built in auditing没有给我任何线索。

是否有关于请求使 ASP.NET 身份处于有趣状态的 token 的事情?在您可以写入表之前需要短暂的等待?扩展基本身份设置的自定义字段是否容易出现此类问题? 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/

有关c# - SQL 写入 ASP.NET 用户表不保存的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  3. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  9. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  10. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

随机推荐