如何将ajax.abort()传播到控制器

时间:2015-05-08 14:43:10

标签: javascript c# ajax asp.net-mvc model-view-controller

我在将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
 }

1 个答案:

答案 0 :(得分:1)

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

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

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

这就是TCP / IP和HTTP协议的设计行为,它使得互联网成为一个松散连接的节点网络,可以随意丢弃或上线。

多长时间,一旦发送请求,就无法从客户端取消服务器端的请求。

对于您的方案,最好的方法是简单地禁用用户发出另一个请求的能力,直到服务器响应或超过一些超时时间。如果请求是如此资源密集,您可以根据需要多次调用它,这对于DoS攻击来说是一个巨大的机会