你如何取消AJAX长期运行的MVC动作客户端(在javascript中)?

前端之家收集整理的这篇文章主要介绍了你如何取消AJAX长期运行的MVC动作客户端(在javascript中)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个长时间运行(4-10秒)的MVC操作,它运行来自AJAX调用的报告.在运行时,用户可以更改参数并运行其他内容,因此我在制作另一个之前取消了AJAX请求.

所以,例如(jQuery中的示例,但无论如何都会出现问题):

// If we have an active request and it's not complete
if(dataRequest && dataRequest.readyState != 'complete') 
{
    dataRequest.abort();
}

dataRequest = $.ajax(...);

客户端这似乎工作正常,但已取消的请求仍在服务器上运行.例如,如果报告需要10秒,我取消一个并启动另一个,那么第二个请求需要20秒.

我认为这是由于session level locking

[If] two concurrent requests are made for the same session (by using
the same SessionID value),the first request gets exclusive access to
the session information. The second request executes only after the
first request is finished.

因此第二个请求在第一个请求完成之前无法访问会话.使用异步MVC操作似乎并没有解决这个问题,因为操作仍然需要能够对会话进行更改.

是否可以在不使用AsyncController或[SessionState(SessionStateBehavior.ReadOnly)]的情况下停止一个操作并启动下一个操作?

如果不是都需要?

[SessionState(SessionStateBehavior.ReadOnly)]或完全禁用会话足以允许从同一会话并发访问控制器操作.所以第二个请求(来自同一个会话)不需要在处理之前等待第一个请求完成.至于取消服务器上的第一个操作,嗯,这将更难.您必须将每个任务与唯一ID相关联,并在启动新任务时将此任务ID返回给客户端.然后,当您通过调用.abort()取消客户端上的AJAX请求时,您可以触发另一个AJAX请求到其他控制器操作并将其传递给唯一的任务ID.此控制器操作本身将设置一些公共标志以指示要停止的第一个操作.

TPL具有内置的取消支持,您可以查看它以简化它,以避免将同步它们的2之间的共享数据结构.

原文链接:https://www.f2er.com/ajax/160231.html

猜你在找的Ajax相关文章