gpt4 book ai didi

c# - 避免来自 ASP.NET 中的 View 的双重请求的最佳实践

转载 作者:行者123 更新时间:2023-11-30 19:24:05 25 4
gpt4 key购买 nike

我有以下 Controller :

[HttpPost]
public ActionResult SomeMethod(string foo, obj bar)
{
//Some Logic
}

现在假设从 Button 或 Ajax(经过一些编辑)调用 Action 的角度来看,我不想接收双重请求。

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


更新

You'd first have to define the time interval that would meet the criteria of a double request – Jonesopolis

假设在这种情况下,当第一次和第二次调用之间的时间差小于 1 秒时出现双重请求

最佳答案

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

但是,这里的主要规定是您必须将其记录在某处,并且需要花费一些时间。可能只有几毫秒,但这可能足以让重复请求进入,尤其是当用户双击提交按钮时,这通常是双重提交的原因。

Web 服务器只是在请求传入时对其做出响应,重要的是,它有多个线程,甚至可能有多个进程同时为请求提供服务。 HTTP 是一种无状态协议(protocol),因此服务器不关心客户端之前是否发出过相同的请求,因为它实际上知道客户端之前发出过相同的请求。如果两个重复的请求几乎同时在两个不同的线程上被服务,那么在另一个线程检查它是否重复之前,看看一个人是否可以设置一些东西来识别另一个是重复的,这是一场竞赛。换句话说,大多数时候,您只是运气不好,无论您尝试在服务器端做什么来阻止重复,这两个请求都会通过。

防止重复提交的唯一可靠方法是使用 JavaScript 在提交时禁用提交按钮。然后,用户实际上只能单击一次,即使他们双击也是如此。当然,如果用户禁用 JavaScript,这仍然对您没有帮助,但这种情况越来越少见。

关于c# - 避免来自 ASP.NET 中的 View 的双重请求的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40744939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com