【发布时间】:2012-02-13 10:38:41
【问题描述】:
我有一个长时间运行(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:
[如果] 对同一个会话发出两个并发请求(通过使用 相同的 SessionID 值),第一个请求获得独占访问 会话信息。第二个请求仅在 第一个请求已完成。
因此,在第一个请求完成之前,第二个请求无法访问会话。使用异步 MVC 操作似乎无法解决此问题,因为操作仍然需要能够对会话进行更改。
是否可以在不使用AsyncController 或[SessionState(SessionStateBehavior.ReadOnly)] 的情况下停止一项操作并开始下一项操作?
如果不是两者都需要?
【问题讨论】:
标签: javascript asp.net ajax asp.net-mvc