繁体   English   中英

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

[英]How to propagate the ajax.abort() to the controller

我在传播终止向控制器的ajax调用时遇到问题。

我在View代码中有一个JavaScript函数,可由用户随时调用。 然后,它使用ajax将值传输到控制器。 然后,控制器对Input进行耗时的操作并返回结果。

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

停止并重新开始新的输入。 本质上,我需要将中止调用传播到我的控制器代码,并进行相应处理

要么

我需要能够同时运行控制器功能的多个实例。

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

查看代码

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
 }

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

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

关键是,一旦您的AJAX请求发送完毕,服务器就会轻松地处理该请求。 如果客户端应中止该请求,则不会向服务器发出任何通知。 当服务器尝试发送响应时,它只会被拒绝,并且服务器将忽略它并继续下一个请求。

这就是TCP / IP和HTTP协议的设计行为方式,这正是使Internet成为松散连接的节点网络(可以随意断开或联机)的原因。

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

对于您的方案,最好的办法是简单地禁用用户发出另一个请求的能力,直到服务器响应或某个超时时间过去为止。 如果请求是如此耗费资源,并且您可以根据需要任意多次调用它,那么这将是DoS攻击的巨大机会

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM