我在将ajax调用中止传播到控制器时遇到问题。
我在View代码中有一个JavaScript函数,可以由用户随时调用。然后使用ajax将值传送给控制器。然后控制器对输入执行耗时的操作并返回结果。
我想要的是当用户调用该函数时,如果它已经在执行耗时的操作:
停止并使用新输入重新开始。本质上,我需要将中止调用传播到我的控制器代码并相应地处理它
OR
我需要能够运行多个控制器功能的同时实例。
这可能吗?什么是最好的方法。
查看代码
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;
}
控制器
public int DoSomething(int Input)
{
int RetVal
//Calculate RetVal from Input, very Time Consuming
Return RetVal
}
答案 0 :(得分:1)
这是客户端 - 服务器问题。 HTTP中的客户端和服务器之间的连接不是持久的。客户端打开与服务器的连接并发出请求。然后关闭连接。服务器处理请求,打开连接回客户端,并发送响应。
注意:从HTTP 1.1开始,这在技术上不再正确。在许多情况下,连接实际上是通过HTTP 1.1保留的,但仅仅是为了减少必须重新建立连接的延迟。原则上,客户端和服务器的行为仍然像连接已关闭一样。
重点是,一旦发送了AJAX请求,服务器就会快速处理请求。如果客户端应该中止请求,则不会向服务器发出通知。当服务器尝试发送响应时,它将被拒绝,服务器将忽略它并继续下一个请求。
这就是TCP / IP和HTTP协议的设计行为,它使得互联网成为一个松散连接的节点网络,可以随意丢弃或上线。
多长时间,一旦发送请求,就无法从客户端取消服务器端的请求。
对于您的方案,最好的方法是简单地禁用用户发出另一个请求的能力,直到服务器响应或超过一些超时时间。如果请求是如此资源密集,您可以根据需要多次调用它,这对于DoS攻击来说是一个巨大的机会