.NET 实现的同步令牌模式






3.22/5 (6投票s)
2005年10月5日
1分钟阅读

32633

461
一篇关于解决 Web 表单意外重复提交问题的文章。
引言
Joe 在网上购物,他点击“提交”按钮下单,5 秒内没有任何反应,他以为出了问题,又点击了一次按钮!
发生了什么?
Joe 可能被收取了两次费用!!这是因为他无法收到响应,但服务器收到了他两次请求,并为他下了重复的订单。
这里有一个可以防止此类错误的解决方案。
背景
基本上,这是 .NET 实现的同步令牌模式,这种模式在 Java 世界已经使用了多年(请参考 Core J2EE Patterns)。
使用代码
它非常容易使用
- 在您的项目中添加对
SynchronizerToken
程序集的引用。 - 让您的页面继承自
Synchronizer
页面。 - 在您的页面类之前添加
[OneSubmitOnly]
属性。
// Default message will be shown when duplicated
// submission happened if no RedirectURL property set.
//[OneSubmitOnly]
// Request will be redirected to ErrorPaga.aspx
// when duplicated submission happened.
[OneSubmitOnly(RedirectURL = "~/ErrorPage.aspx")]
public class WebForm1 : Synchronizer
{
.......
}
关注点
OneSumbmitOnly
属性有一个可选的RedirectURL
属性,它指向一个有效的 URL,当发生重复提交时,请求将被重定向到该 URL。如果未设置RedirectURL
属性,则请求将被拒绝,并显示默认消息。- 在任何子类事件之前检查重复提交。
历史
- 版本:1.0
- 创建日期:2005-09-30
- 版本:1.1
- 修改日期:2005-10-5
找到了一种方法,通过重写
OnLoad
事件处理程序,使重复提交检查在任何子类事件发生之前进行。现在不用担心在子类的Page_OnLoad
方法中发生一些愚蠢的事情,然后再进行重复提交检查。
- 修改日期:2005-10-5