避免来自ASP.NET中的View的双重请求的最佳做法

Sid*_*Sid 2 c# asp.net asp.net-mvc

我有以下控制器:

[HttpPost]
public ActionResult SomeMethod(string foo, obj bar)
{
  //Some Logic 
}
Run Code Online (Sandbox Code Playgroud)

现在假设从一个Button或Ajax(带有一些编辑)调用Action,我不想收到双重请求.

从服务器端处理它的最佳方法是什么?


更新

您首先必须定义符合双重请求标准的时间间隔 - Jonesopolis

让我们假设在这种情况下,双重请求是指第一次和第二次呼叫之间的时间差小于1s

Chr*_*att 5

坦率地说,你不能,至少不完全.你可以在服务器端做某些事情,但没有一个是万无一失的.一般的想法是你需要以某种方式识别POST.最常见的方法是使用GUID或类似设置隐藏输入.然后,当有请求进入时,您会在某处记录该GUID .这可以在会话中,在数据库中等.然后,在处理请求之前,检查您为该GUID使用的任何数据存储.如果它存在,那么它是一个重复的POST,如果没有,你可以继续.

但是,这里的重要规定是你必须在某个地方记录,这需要一段时间.它可能只有几毫秒,但这可能足以让重复请求进入,特别是如果用户双击提交按钮,这通常是双重提交的原因.

Web服务器只是在请求进入时响应请求,重要的是,它有多个线程,甚至可能有多个进程同时处理请求.HTTP是一种无状态协议,因此服务器不关心客户端之前是否发出了相同的请求,因为它实际上并不知道客户端之前发出过相同的请求.如果在两个不同的线程上几乎同时提供了两个重复请求,那么在另一个检查是否重复之前,可以查看是否可以设置将另一个标识为副本的内容.换句话说,大多数情况下,你只是运气不好,无论你试图做什么服务器端停止重复,这两个请求都会通过.

防止双重提交的唯一可靠方法是使用JavaScript禁用提交时的提交按钮.然后,即使双击,用户也只能有效点击一次.当然,如果用户禁用JavaScript,这仍然无法帮助您,但这种情况越来越少见.