2013-01-16 66 views
0

我有一个需求,我需要在我的MVC 4网站的用户会话开始时创建数据库记录。创建MVC会话的唯一记录

的入口点控制器的轮廓看起来是这样的:

public ActionResult Index(int userId, int requestId) { 
    var userInfo = db.GetUserInfo(userId, requestId); 

    if (userInfo == null) { 
     userInfo = db.CreateUserInfo(userId, requestId); 
    } 

    // rest of code 
} 

我所发现的是,这个代码是不是在尽可能多的很ocassionaly重复记录创建(通常具有相同的完全可靠创建日期 - 至少到最近的毫秒)。我只能假设(外部)网页/客户端生成两个几乎同时发出的请求。

请注意,如果用户在日后返回站点(使用相同的查询字符串参数),那么我希望他们拿起现有的userInfo记录。

我知道我可以通过在表中添加一个唯一索引来解决问题,我可能需要做任何事情,但是我想知道是否有更好的模式可以遵循?

+1

这种类型的代码更适合将它添加到'Session_start'事件中的'Global.asax'文件中。通过这种方式,您可以捕获在最初入口点以外的其他地方进入的用户。 –

+0

背后的意图是什么!在if条件下? – tigeronk2

+1

if(!userInfo == null)用于检查记录是否已经存在。如果userInfo为空,则需要新记录。 – Neilski

回答

2

当用户会话注册并将其存储在数据库的userInfo表中时,为该用户会话生成一个随机字符串。当用户稍后访问该网站时,您只需检查用户名和密码以进行身份​​验证,如果成功,那么您将从该数据库中为该用户获取之前存储的唯一随机字符串,并将其放入会话。这样,您可以在整个生命周期中关闭用户使用相同的随机字符串。希望这有助于

+0

问题在于它是描述记录唯一性的查询字符串参数的组合。用户有可能会在以后返回该网站。在这种情况下,我需要他们能够拿起现有的userInfo记录。 – Neilski

+0

@Neilski更新了我的答案...... –

+0

谢谢Bhushan。虽然这不可能,但我认为,因为我接受了两个初始请求,是不是也有可能会创建两个会话? – Neilski