【问题标题】:Stateful session with nhibernate and asp.net与 nhibernate 和 asp.net 的有状态会话
【发布时间】:2011-06-15 12:35:30
【问题描述】:

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

现在一连串的事情是这样的

  1. 用户填写表格。
  2. 他提交了表格。
  3. 创建了休眠会话工厂,并通过客户对象将其保存到数据库中。
  4. 数据库使用nhibernate的本机生成器提交会话对象
  5. 但是在服务器的响应到达客户端之前发生了意外。与客户端的连接断开。
  6. 客户端看到页面未找到错误或请求超时错误。并且有一个他还没有注册的窘境。
  7. 于是他再次按下刷新按钮。并且同一组数据(尽管已提交到 database )已发送到服务器以进行数据库提交。
  8. 服务器看到数据并再次用不同的 id 注册同一个客户。
  9. 所以问题是这样的。现在同一个客户条目被重复了两次,因为连接被切断了。

现在有人可以告诉我如何进入这个场景。这样即使客户提交了他也只会识别一个条目并提交它,即使响应已被切断并按下刷新按钮?

【问题讨论】:

    标签: nhibernate session-state


    【解决方案1】:

    想法:

    1) 您不想在每个请求上都创建 NHibernate SessionFactory。这应该创建一次,然后由所有未来的请求使用。这是一个重量级的手术。每个请求只需要创建会话。

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

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

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

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

    【讨论】:

    • 第四点你能给出一个虚拟的示例代码吗?我实际上理解了这个概念,但还没有实现,我没有使用任何 MVC,而是使用普通的 asp.net 3.5,所以如果你能提供一个虚拟代码,如何使用控制器方法。这会很有帮助 :( 很抱歉,请你帮个忙。但不能真正理解如何实施
    • 不一定是控制器 - 编辑说高级方法 - 例如在 Page_Load 中。所以 Page_Load 应该打开事务,检查数据库,看看用户是否已经注册,如果没有,保存新的用户详细信息,然后提交事务和响应。重定向到表明注册成功的页面。
    • 你的意思是我应该实现 ihttpModule 然后在其中使用一些 context.beginrequest 事件来完成这项工作..然后检查会话是否已经存在..它只会更新那个会话或者它会说用户已经存在......之后,当它的 context.endrequest 事件发生时,它会简单地清除本地会话。这就是你想说的吗?我搜索并发现此链接指向您所描述的情况。 adammatusiak.blogspot.com/2010/03/…
    猜你喜欢
    • 2015-07-23
    • 2019-10-28
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多