Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与nhibernate和asp.net的有状态会话_Nhibernate_Session State - Fatal编程技术网

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

与nhibernate和asp.net的有状态会话,nhibernate,session-state,Nhibernate,Session State,假设我有一个客户,他正在从网站上填写数据。使用的底层持久性是Nhibernate 现在一系列的事件都是这样的 用户填写表单 他提交了表格 创建nhibernate sessionfactory,并通过客户对象将其保存到数据库中 数据库使用nhibernate的本机生成器提交会话对象 但是,在服务器的响应到达客户端之前,就会发生意外。与客户端的连接断开 客户端将看到页面未找到错误或请求超时错误。他进退两难,还没有注册 于是他再次按下刷新按钮。并且相同的数据集(尽管已提交到数据库)已发送到服务器进行

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

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

  • 用户填写表单
  • 他提交了表格
  • 创建nhibernate sessionfactory,并通过客户对象将其保存到数据库中
  • 数据库使用nhibernate的本机生成器提交会话对象
  • 但是,在服务器的响应到达客户端之前,就会发生意外。与客户端的连接断开
  • 客户端将看到页面未找到错误或请求超时错误。他进退两难,还没有注册
  • 于是他再次按下刷新按钮。并且相同的数据集(尽管已提交到数据库)已发送到服务器进行数据库提交
  • 服务器看到数据,并再次使用不同的id注册同一客户
  • 所以问题是这样的。现在,由于连接被切断,同一客户条目被复制了两次 现在有人能告诉我如何进入这个场景吗。因此,即使客户提交,他也只会识别一个条目并提交,即使响应被切断并按下刷新按钮?

    思考:

    1) 您不希望在每个请求上都创建NHibernate SessionFactory。这应该创建一次,然后供将来的所有请求使用。这是一个沉重的手术。每个请求只需要创建会话

    2) 以高级方法管理事务—在您提交事务后,但在客户做出响应之前,降低出错的可能性

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

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


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

    第四点,您可以给出一个虚拟示例代码吗?我实际上理解了这个概念,但还没有实现,我没有使用任何MVC,而是使用普通的asp.net 3.5,所以如果你能提供一个虚拟代码,那么如何使用控制器方法呢。这将非常有帮助:(对不起,请帮忙。但无法真正了解如何实现,不需要控制器-编辑为高级方法-例如在Page_Load内。因此Page_Load应打开事务,检查数据库以查看用户是否已注册,如果未注册,则保存新的用户详细信息,然后提交事务和响应。重定向到Page in表示注册成功。你的意思是我应该实现ihttpModule,然后在其中使用某种context.beginrequest事件来完成任务..然后检查会话是否已经存在..它将仅使用该会话进行更新,否则它会说用户已经存在..之后,当它的context.endrequest事件这就是你想说的吗?我搜索并找到了这个链接,它指向你所说的b类情况。