我使用异步XMLHttpRequest来调用ASP.net Web服务中的函数
当我在XMLHttpRequest上调用abort方法时,在服务器收到请求并处理它之后,服务器继续处理请求。
有没有办法停止服务器上的请求处理?
答案 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
因此,如果您确实需要在服务器上取消某些任务,可以将这些文章用作实施所需解决方案的起点。