我有以下控制器:
[HttpPost]
public ActionResult SomeMethod(string foo, obj bar)
{
//Some Logic
}
现在假设从视图的角度来看,是从Button或Ajax(进行一些编辑)调用Action的,而我不想收到重复请求。
从服务器端处理它的最佳方法是什么?
您首先必须定义满足双重请求条件的时间间隔– Jonesopolis
假设在这种情况下,两次调用是第一次和第二次调用之间的时间差小于1s时
坦白说,你不能,至少不是全部。您可以在服务器端执行某些操作,但都不是万无一失的。通常的想法是,您需要通过某种方式来标识POST。最常见的方法是使用GUID或类似设置来设置隐藏的输入。然后,当有请求进入时,将该GUID记录在某处。这可以在会话中,也可以在数据库中,等等。然后,在处理请求之前,您检查用于该GUID的任何数据存储。如果存在,则它是重复的POST,如果不存在,则可以继续。
但是,这里的主要规定是您必须将其记录在某个地方,并且要花一些时间。可能只有几毫秒,但是对于重复的请求来说可能就足够了,特别是如果用户双击提交按钮,这通常是重复提交的原因。
Web服务器只是在请求进入时对其做出响应,重要的是,它具有多个线程,甚至可能有多个进程同时为请求服务。HTTP是无状态协议,因此服务器不关心客户端之前是否发出过相同的请求,因为它实际上不知道客户端之前发出过相同的请求。如果两个重复的请求实际上是同时在两个不同的线程上处理的,那么这是一个竞赛,要看一个人是否可以设置一个将另一个标识为重复的东西,然后再另一个检查它是否是重复的。换句话说,大多数情况下,您只是运气不好,无论您尝试在服务器端执行什么操作来停止重复项,这两个请求都会通过。
防止重复提交的唯一可靠方法是在使用JavaScript提交时禁用“提交”按钮。这样,即使双击,用户也只能有效地单击一次。当然,如果用户禁用JavaScript,那仍然无济于事,但是这种情况越来越少。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句