Old*_*art 5 c# asp.net asp.net-mvc jquery asp.net-mvc-4
我希望得到一些关于我打算用来防止 ASP.NET MVC 4 应用程序中重复记录的方法的反馈,以及我没有想到的对用户体验的影响。
Web 表单有六个输入字段和一个保存按钮(以及一个取消按钮),用户最多可能需要 10 分钟来填写表单。
通过帖子提交字段后,页面将在成功/失败时重定向到不同的页面,然后使用新的 Guid 作为主键将数据记录在数据库表中。
为了阻止用户多次按下保存按钮,但允许浏览器在关闭的连接上重新发布请求,我打算在呈现表单时为新记录的主键提供 Guid 作为隐藏的输入字段。
如果发生repost,或者用户多次按save,数据库服务器会因为key重复而拒绝记录的第二个post,我可以在服务器端检查和处理。
但这会给我带来更大的问题吗?
如果您在表单中使用隐藏的防伪令牌(正如您应该的那样),您可以在第一次提交时缓存防伪令牌,并在需要时从缓存中删除令牌,或者在设定的时间后使缓存的条目过期.
然后,您将能够针对缓存检查每个请求是否已提交特定表单,如果已提交则拒绝它。
您不需要生成自己的 GUID,因为在生成防伪令牌时已经这样做了。
更新
在设计您的解决方案时,请记住,每个请求都将在其自己单独的线程中异步处理,甚至可能在完全不同的服务器/应用程序实例上进行处理。
因此,完全有可能甚至在第一个缓存条目出现之前就可以处理多个请求(线程)。要解决此问题,请将缓存实现为队列。在每次提交(post 请求)时,将机器名/id 和线程 id 以及防伪令牌写入缓存中......延迟几毫秒,然后检查缓存/队列中最旧的条目是否为那个防伪令牌对应。
此外,所有正在运行的实例都必须能够访问缓存(共享缓存)。