gpt4 book ai didi

javascript - 如何将 ajax.abort() 传播到 Controller

转载 作者:行者123 更新时间:2023-12-03 10:10:38 24 4
gpt4 key购买 nike

我在将 ajax 调用的中止传播到 Controller 时遇到问题。

我在 View 代码中有一个 JavaScript 函数,用户可以随时调用该函数。然后使用 ajax 将值传输到 Controller 。然后 Controller 对输入执行耗时的操作并返回结果。

我想要的是,当用户调用该函数时,如果它已经执行了耗时的操作:

停止并使用新输入重新开始。本质上,我需要将中止调用传播到我的 Controller 代码并相应地处理它

或者

我需要能够同时运行 Controller 函数的多个实例。

这可能吗?以及最好的方法是什么。

查看代码

var AJAXSetPalette = null;    

function DoSometing(Input) {

if (AJAXSetPalette)
AJAXSetPalette.abort();

AJAXSetPalette = $.ajax({
type: "POST",
url: "ImagesAnalysis/DoSomething",
datatype: "json",
traditional: true,
data: Input,
success: function (Data) {
DoJSFunction(Data);
}
return;
}

Controller

 public int DoSomething(int Input)
{
int RetVal
//Calculate RetVal from Input, very Time Consuming
Return RetVal
}

最佳答案

这是一个客户端-服务器问题。 HTTP 中客户端和服务器之间的连接不是持久的。客户端打开与服务器的连接并发出请求。然后连接关闭。服务器处理请求,打开回客户端的连接,并发送响应。

注意:从 HTTP 1.1 开始,这在技术上不再成立。在许多情况下,连接实际上是通过 HTTP 1.1 保持的,但这仅仅是为了减少重新建立连接带来的延迟。原则上,客户端和服务器的行为仍然就像连接已关闭一样。

重点是,一旦发送 AJAX 请求,服务器就会愉快地处理该请求。如果客户端应中止请求,则不会向服务器发出通知。当服务器尝试发送响应时,它将被简单地拒绝,并且服务器将忽略它并继续下一个请求。

这就是 TCP/IP 和 HTTP 协议(protocol)的设计方式,也使得互联网成为松散连接的节点网络,可以随意断开或上线。

总而言之,一旦发送了客户端的请求,服务器端就无法取消该请求。

对于您的场景,最好的办法是简单地禁用用户发出另一个请求的能力,直到服务器响应或超时时间过去。如果请求非常耗费资源,并且您可以任意多次、任意快速地调用它,那么这就是 DoS 攻击的巨大机会

关于javascript - 如何将 ajax.abort() 传播到 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30126571/

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