【问题标题】:jquery .ajax request blocked by long running .ajax requestjquery .ajax 请求被长时间运行的 .ajax 请求阻塞
【发布时间】:2010-03-09 21:44:32
【问题描述】:

我正在尝试使用 jQuery 的 .ajax 功能来制作进度条。

通过 .ajax 提交请求,这会启动一个长时间运行的进程。一旦提交了另一个 .ajax 请求,就会每隔一段时间调用一次,以检查此过程的进度。然后使用此信息更新进度表。

但是,进度 .ajax 调用仅在长时间运行的进程完成后返回。就像它被初始请求阻止了一样。

奇怪的是,这个过程在 dev 上运行良好,但在部署服务器上却失败了。我正在使用 ASP.Net MVC 在 IIS 上运行。

更新:显然,它与浏览器相关,因为它在 IE 7 上运行良好,但在 IE 8 上无法运行。这很奇怪,因为 IE 8 最多允许 6 个宽带连接,而 IE 7 只允许 2 个请求每个域。

Update2:我认为这是一个本地问题,因为它似乎在另一台 IE 8 机器上运行良好。

【问题讨论】:

  • 看起来您的服务器一次只处理一个请求。您能否提供一些服务器日志(请求何时到达服务器,何时响应?)也许还有服务器配置和服务器代码?也可能是您的进度检查(服务器端)由于某种原因被阻止。或者你已经达到了浏览器的最大连接/域限制?

标签: asp.net-mvc iis jquery


【解决方案1】:

服务器一次只会从每个用户运行一个页面。当您发送请求以获取进度状态时,它们将被排队。

解决方案是使用@Page 指令中的EnableSessionState="false" 使返回状态的页面无会话。这样它就不会与任何用户关联,因此请求不会排队。

这当然意味着您不能使用会话状态将进度状态从运行进程的线程传递到获取状态的线程。您必须使用不同的方式来跟踪正在运行的进程并发送一些标识符以及获取状态的请求,以便您知道它来自哪个用户。

【讨论】:

  • 可以在标题为“并发请求和会话状态”的部分下找到 here 的引用文档
【解决方案2】:

某些浏览器(尤其是 IE)只允许同时向同一个域发出两个请求。如果同时发生任何其他请求,那么您可能会遇到此限制。一种解决方法是为域设置几个不同的别名(一些网站使用“www1.example.com”和“www2.example.com”等)

您应该能够使用 Firebug 或 Fiddler 来确定正在进行的请求数量等。

【讨论】:

  • 更进一步,我过去使用的另一种方式是,第一个请求将在服务器上启动一个全新的线程来“在后台”处理请求,以便第一个 Ajax 请求立即返回。然后您可以使用后续请求来返回进度。这有点(很多)工作,但它不会长时间占用服务器连接。
【解决方案3】:

为您的第二个 ajax 请求创建一个异步处理程序 (IHttpAsyncHandler)。

使用 .ashx 查询字符串所需的任何参数来处理您想要的,因为 HttpContext 没有您需要的。您几乎无法访问 Application 对象。

在幕后 ASP.NET 将为您从 CLR 池而不是应用程序池创建一个线程,因此您将通过 IHttpAsyncHandler 获得额外的性能提升

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2019-11-04
    • 1970-01-01
    • 2021-11-14
    • 2012-04-22
    相关资源
    最近更新 更多