我有一个长时间运行(4-10秒)的MVC动作,它运行AJAX调用的报告。在运行时,用户可以更改参数并运行其他内容,因此我在取消AJAX请求之前取消了另一个请求。如何取消AJAX长时间运行的MVC操作客户端(在JavaScript中)?
所以,举例来说(例如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:
[如果]两个并发请求(通过使用 相同的SessionID值)为同一会议上提出的第一个请求到达 独占访问会话信息。第二个请求仅在 第一个请求完成后才执行。
所以第二个请求不能访问会话,直到第一个请求完成。使用异步MVC操作似乎无法解决此问题,因为该操作仍需要对会话进行更改。
如果不使用AsyncController
或[SessionState(SessionStateBehavior.ReadOnly)]
,可以停止一个动作并开始下一个动作吗?
如果不是都需要?
要小心依靠'IsClientConnected',因为它可能显然是一个严重的性能问题来检查它,请参阅http://stackoverflow.com/questions/9094735/when-is-response-isclientconnected-slow – Keith 2012-02-29 14:09:25
嗨基思!我有一个类似的问题,但不能解决它,即使你的答案,(http://stackoverflow.com/questions/29235850/how-to-abort-long-running-ajax-request-in-net-mvc-4 )有什么方法可以帮助我?或者你可以发布你的示例代码来触发'this.Response.IsClientConnected' – 2015-03-26 09:04:19