当前位置: 首页 > 面试题库 >

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

雍阳
2023-03-14
问题内容

我有一个运行时间较长(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秒。

我认为这是由于会话级别锁定引起的:

[如果]对同一会话发出两个并发请求(通过使用相同的SessionID值),则第一个请求将获得对会话信息的互斥访问。仅在第一个请求完成后才执行第二个请求。

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

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

如果不是全部都需要?


问题答案:

事实证明,完整的答案需要两件事:

首先(感谢Darin确认),会话实际上锁定了要一个接一个执行的页面。进一步的调查表明,这是ASP.Net会话的一个更普遍的问题-
它们只是无法处理乐观并发。

其次,被取消的请求需要检查客户端是否仍然连接。在某些情况下,您可能希望继续执行操作(例如开火并忘记ASP操作),但是在这种情况下,如果客户不再等待报告,我们继续处理它就没有意义。

这是响应的属性:this.Response.IsClientConnected

因此,要在jQuery请求时有效取消服务器端操作,我必须编写自己的会话处理程序并针对进行定期检查this.Response.IsClientConnected



 类似资料:
  • 问题内容: 我想知道是否有一种简单的方法来取消AJAX请求? 除了在客户端的XMLHTTPRequest上调用“中止”之外,还有没有一种方法可以轻松地停止服务器进程?服务器正在使用Apache。 谢谢 问题答案: 不,绝对没有简单的方法。 我可以想到一些复杂的方法,但是它们将不可靠。 开发一个流程来 逆转 刚运行的请求中的更改可能会更幸运(我假设这就是您想要停止它的原因。)

  • 我看到ccence cli支持cli的上述命令interface.How通过java执行此操作sdk.Im看到仅支持启动工作流。

  • 问题内容: 我有一个“长期运行的”清理行动,我需要执行我的。做这个的最好方式是什么? 如果我使用a 这样做,我将立即返回;但是线程引用发生了什么?我正在寻找有关此处需要了解的任何影响/陷阱/绊网的建议,因为我认为即使活动被销毁,该流程仍将继续存在。 背景: 我在我的应用程序中使用JmDNS。当用户使用完我的应用程序后,我想清理JmDNS实例。我使用类方法进行此操作。但是,此方法需要 5秒钟以上 才

  • 问题内容: 在Java方法中,我想使用Jersey客户端对象在RESTful Web服务(也使用Jersey编写)上执行POST操作,但不确定如何使用客户端发送将用作FormParam的值在服务器上。我能够发送查询参数就好了。 问题答案: 我自己尚未完成此操作,不过Google- Fu的简短内容在blogs.oracle.com上提供了一个技术提示,其中包含您真正要求的示例。 摘自博客文章的示例:

  • 这个问题与python的问题类似:WebSocket服务器在python中定期发送消息 给出的在Perl中创建WebSocket的示例使用了一个小型消息发送服务:http://search.cpan.org/~topaz/net-websocket-server-0.001003/lib/net/WebSocket/server.pm 此示例是基于事件的,并且仅基于从客户端发送的消息向客户端发送消

  • Vext.x核心手册建议使用< code>executeBlocking()执行阻塞代码,以防止事件循环被阻塞。尽管如此,它还指出: 阻止代码 [] 应阻止合理的时间(即不超过几秒钟)。长阻塞操作...被排除在外。当阻止操作持续超过10秒时,将在控制台上打印一条消息[...]。长阻塞操作应使用由应用程序管理的专用线程,该线程可以使用事件总线或 runOnContext 与顶点进行交互 所以我不能在