65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET 实现的同步令牌模式

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.22/5 (6投票s)

2005年10月5日

1分钟阅读

viewsIcon

32633

downloadIcon

461

一篇关于解决 Web 表单意外重复提交问题的文章。

Sample Image

引言

Joe 在网上购物,他点击“提交”按钮下单,5 秒内没有任何反应,他以为出了问题,又点击了一次按钮!

发生了什么?

Joe 可能被收取了两次费用!!这是因为他无法收到响应,但服务器收到了他两次请求,并为他下了重复的订单。

这里有一个可以防止此类错误的解决方案。

背景

基本上,这是 .NET 实现的同步令牌模式,这种模式在 Java 世界已经使用了多年(请参考 Core J2EE Patterns)。

使用代码

它非常容易使用

  1. 在您的项目中添加对 SynchronizerToken 程序集的引用。
  2. 让您的页面继承自 Synchronizer 页面。
  3. 在您的页面类之前添加 [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 
{
  .......
}

关注点

  1. OneSumbmitOnly 属性有一个可选的 RedirectURL 属性,它指向一个有效的 URL,当发生重复提交时,请求将被重定向到该 URL。如果未设置 RedirectURL 属性,则请求将被拒绝,并显示默认消息。
  2. 在任何子类事件之前检查重复提交。

历史

  • 版本:1.0
    • 创建日期:2005-09-30
  • 版本:1.1
    • 修改日期:2005-10-5

      找到了一种方法,通过重写 OnLoad 事件处理程序,使重复提交检查在任何子类事件发生之前进行。现在不用担心在子类的 Page_OnLoad 方法中发生一些愚蠢的事情,然后再进行重复提交检查。

© . All rights reserved.