在asp.net上处理XMLHttpRequest abort

时间:2012-11-18 14:16:04

标签: asp.net xmlhttprequest

我使用异步XMLHttpRequest来调用ASP.net Web服务中的函数 当我在XMLHttpRequest上调用abort方法时,在服务器收到请求并处理它之后,服务器继续处理请求。
有没有办法停止服务器上的请求处理?

2 个答案:

答案 0 :(得分:3)

一般来说,不,一旦启动,您就无法停止服务器正在处理的请求。毕竟,服务器如何知道请求何时被中止?

就像你导航到一个网页,但在加载第一个网页之前浏览到另一个网页。至少在某种程度上(当然不会发生任何客户方工作),初始请求将得到满足。

如果您确实希望在服务器上停止长时间运行的操作,则需要对要调用的服务进行架构,以便它可以支持被中断。一些伪代码:

void MyLongRunningMethod(opId, args)
{
    work = GetWork(args)

    foreach(workItem in work)
    {
        DoWork(workItem)

        //Has this invocation been aborted?
        if(LookUpSet.Contains(opId))
        {
            LookUpSet.Remove(opId)
            return
        }
        //Or try this:
        if(Response.IsClientConnected)
        {
            HttpContext.Current.Response.End();
            return;
        }
    }
}

void AbortOperation(opId)
{
    LookUpSet[opId] = true
}

所以这里的想法是MyLongRunningMethod定期检查它是否已经中止,如果是,则返回。 opId是唯一的,因此您可以根据附加当前时间或其他内容的客户端的会话ID生成它(在Javascript中,new Date().getTime()将获得自此以来的毫秒数历元)。

使用这种方法,服务器必须维护状态(在我的示例中为LookUpSet),因此您需要某种方式来执行此操作,例如数据库或仅将其存储在内存中。该服务还需要设计,以便调用中止不会使事物处于非工作状态,这当然在很大程度上取决于它的作用。

另一个非常重要的要求是数据可以拆分并以块的形式进行处理。这使得服务可以被中断。

最后,如果要中止某些操作,则必须调用AbortOperation - 简单地中止XMLHttpRequest调用将无法提供帮助,因为操作将持续到完成。

修改

从这个问题:ASP.Net: How to stop page execution when browser disconnects?

您还可以检查Response.IsClientConnected属性以尝试确定调用是否已中止。

一般来说,服务器在尝试向其发送数据之前不会知道客户端已断开连接。请参阅Best practice to detect a client disconnection in .NET?Instantly detect client disconnection from server socket

答案 1 :(得分:0)

正如nick_w所写,你无法阻止服务器启动后处理的请求。但是有能力实施解决方案,这将使您能够取消服务器任务。 Dino Esposito有几篇关于如何实现这些事情的精彩文章: Canceling Server Tasks with ASP.NET AJAX

并在以下文章中实现池到服务器Dino Esposito描述了如何使用SignalR库: Build a Progress Bar with SignalR; Long Polling and SignalR

因此,如果您确实需要在服务器上取消某些任务,可以将这些文章用作实施所需解决方案的起点。