waf*_*les 12 c# sql-server asp.net azure asp.net-web-api
我的设置:
当用户首次注册时,我会向他们展示"入门介绍".介绍只应运行一次 - 我将介绍启动日期的时间戳记录为ASP.NET用户表中的自定义字段.
想象一下,当我登录(作为用户)并看到介绍TWICE时我会感到惊讶.
AngularJS前端正在向ASP.NET api正确发送"intro Viewed"消息,api以成功消息响应.但是,当我查看db中的原始数据时,时间戳绝对不会更新.因此,用户将第二次看到介绍(此时时间戳正确地记录在db中).
我有一个糟糕的解决方法.客户端从我的服务器请求OAuth Bearer令牌后,客户端会请求用户信息(以决定是否显示该游览).等待100ms然后将"浏览过的"消息发送回服务器会掩盖该问题.
我在任何时候都没有看到存储数据的任何其他问题.因为我们的数据库是在Azure上,所以我无法连接Profiler,内置的审计也没有给我任何线索.
是否有一些关于请求令牌使ASP.NET身份处于有趣状态的令牌?在你写到桌子之前需要等待一段时间?扩展基本身份设置的自定义字段是否容易出现这样的问题?UserManager是否可能在其黑盒子中做一些奇怪的事情?
有没有人建议如何继续调试这个问题?或者听说过类似的东西?
以下是应该更新db中"tour Viewed"时间戳的相关代码:
[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();
}
Run Code Online (Sandbox Code Playgroud)
更新*********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();
Run Code Online (Sandbox Code Playgroud)
小智 5
基本上问题可能在于"UserManager"的初始化以及此类在db上下文上工作的事实,因此您需要将更改保留到该上下文.这是一个例子:
var userStore = new UserStore<ApplicationUser>(new MyDbContext());
var userManager = new UserManager(userStore);
Run Code Online (Sandbox Code Playgroud)
这样你就能记住经理和背景.然后在您的方法中,您通常会调用:
IdentityResult result = await userManager.UpdateAsync(currentUser);
Run Code Online (Sandbox Code Playgroud)
然后将此更改持久保存到db上下文:
var dbContext = userStore.context;
dbContext.saveChanges();
Run Code Online (Sandbox Code Playgroud)
好吧,这就是我为解决问题所做的事情。我将自定义用户数据与内置 ASP.NET 身份信息完全分离。我现在有了一个单独的对象(因此也有单独的 SQL 表),用于存储诸如 FirstName、LastName、LastActiveDate 等内容。
这完全解决了我的问题,尽管在某些情况下它引入了对数据库的另一个调用。我认为这不是一个值得担心的大性能问题。我认为这是某种奇怪的竞争条件,涉及为 ASP.NET 身份用户生成令牌,然后快速写入 Azure SQL 数据库 - 天知道我的代码中到底是什么导致了问题。
如果你遇到一个难以解决的问题,通常最好的计划就是改变问题。
现在我需要找到一个元线程来讨论当你解决了问题时如何处理赏金点......
归档时间: |
|
查看次数: |
960 次 |
最近记录: |