2011-06-15 74 views
0

假设我有一个客户正在填写网站的数据。使用的基础持久性是Nhibernate。nhibernate和asp.net的有状态会话

现在的一系列事件是这样的

  1. 用户填写了表格。
  2. 他提交表格。
  3. nhibernate sessionfactory创建并通过客户对象将其保存到数据库。
  4. 数据库使用nhibernate的本地生成器提交会话对象
  5. 但是在服务器的响应到达客户端之前发生了一个事故。与客户端的连接关闭。
  6. 客户端看到页面未找到错误或请求超时错误。并有一个困境,他尚未注册。
  7. 所以他再次按下刷新按钮。并且相同的数据集(尽管已提交给数据库)已发送到服务器以进行数据库提交。
  8. 服务器看到数据并再次向不同的id注册同一个客户。
  9. 所以问题就像。现在相同的客户条目已被重复两次,导致连接中断。

现在有人可以告诉我如何进入这种情况。因此,即使客户提交,他只能识别一个条目并提交,即使响应已被切断并按下了刷新按钮?

回答

0

思考:

1)你不想在每次请求创建NHibernate的SessionFactory的。这应该创建一次,然后用于所有未来的请求。这是一项重量级的操作。只有会话需要创建每个请求。

2)以高层次方式管理交易 - 减少发生事故后发生事故的可能性,但在客户有回应之前。

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

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

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

+0

第4点可以请你给一个虚拟的例子代码?我其实并不了解这个概念,但还没有实现,我没有使用任何MVC,只是简单的asp.net 3.5,所以如果你可以使用一个控制器方法,如果你可以提供一个虚拟代码。这将是一个非常有用的:(对不起,询问优惠,但真的不知道如何实施 – Joy 2011-06-16 04:42:03

+0

不必控制器 - 编辑说高层次的方法 - 例如在Page_Load。因此,Page_Load应打开交易,检查数据库查看用户是否已经注册,如果没有,保存新的用户详细信息,然后提交事务和Response.Redirect到指示注册成功的页面。 – BonyT 2011-06-16 08:54:52

+0

你的意思是我应该实现ihttpModule,然后使用一些有点context.beginrequest事件内部做它的工作..然后检查会话是否已经存在..它只会更新该会话,否则它会说用户已经存在。 ..之后,当其context.endrequest事件时,它将简单地清除本地会话。这是你想说的方式吗?我搜索了一下,发现这个链接到了你所说的情况。 http://adammatusiak.blogspot.com/2010/03/binding-fluent-nhibernate-session-to.html – Joy 2011-06-17 04:08:36