与nhibernate和asp.net的有状态会话

时间:2011-06-15 12:35:30

标签: nhibernate session-state

假设我的客户正在填写网站上的数据。使用的底层持久性是Nhibernate。

现在一系列事件就像这样

  1. 用户填写表单。
  2. 他提交表格。
  3. 创建了nhibernate sessionfactory,并通过客户对象将其保存到数据库中。
  4. 数据库使用nhibernate的本机生成器提交会话对象
  5. 但是在服务器的响应到达客户端之前发生了一次事故。与客户端的连接消失了。
  6. 客户端看到页面未找到错误或请求超时错误。并且他还没有注册的困境。
  7. 所以他再次按下刷新按钮。并且已将相同的数据集(尽管已提交到数据库)发送到服务器以进行数据库提交。
  8. 服务器查看数据并再次注册具有不同ID的同一客户。
  9. 所以问题就好了。现在,相同的客户条目已被复制两次,因为连接已被切断。
  10. 现在有人可以告诉我如何进入这个场景。因此,即使客户提交,他只识别一个条目并提交它,即使响应已被切断并按下刷新按钮?

1 个答案:

答案 0 :(得分:0)

思想:

1)您不希望在每个请求上创建NHibernate SessionFactory。这应该创建一次,然后由所有将来的请求使用。这是一个重量级的操作。每个请求只需要创建会话。

2)以高级方法管理事务 - 在您提交事务之后减少出现问题的可能性,但在客户端有响应之前。

3)通过让提交功能返回显示信息的不同页面来防止“刷新”方法重新提交。此页面不应提交任何内容。

4)通过根据以前提交的凭据验证提交来防范重新提交服务器端。如果客户已经注册过,请通知客户,并为他们提供访问保存详细信息的方法(例如密码恢复)。

因此,例如,如果您的用户通过电子邮件地址键入,那么在页面加载事件中执行以下步骤: