2010-03-09 183 views
1

我正在尝试使用jQuery的.ajax功能来创建进度条。jquery .ajax请求被长时间运行阻止.ajax请求

请求通过.ajax提供,它启动一个长时间运行的进程。一旦被提交,另一个.ajax请求会在检查此进程进度的时间间隔上被调用。然后使用此信息更新进度表。

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

奇怪的是这个过程在开发上工作正常,但在部署服务器上失败。我使用ASP.Net MVC在IIS上运行。

更新:显然,它是与浏览器相关的,因为它在IE 7上工作正常,但不能在IE 8上工作。这很奇怪,因为IE 8允许多达6个宽带连接,其中IE 7每次只允许2个请求域。

Update2:我认为这是一个本地问题,因为它似乎在另一台IE 8机器上工作正常。

+0

看起来像你的服务器只会在一个请求时间。你能否提供一些服务器日志(何时请求到达服务器,什么时候响应?),也许服务器配置和服务器代码? 也可能是您的进度检查(服务器端)由于某种原因被阻止。或者你已经达到浏览器最大连接/域限制? – MyGGaN 2010-03-09 21:52:05

回答

1

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

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

+0

除此之外,我过去使用的另一种方式是,第一个请求将启动服务器上的全新线程以“在后台”处理请求,以便第一个Ajax请求立即返回。然后您可以使用后续请求返回进度。这有点(多)更多的工作,但它不会长时间捆绑服务器连接。 – 2010-03-09 22:39:47

2

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

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

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

+0

可以在标题为“并发请求和会话状态”的部分下找到引用此文档[此处](http://msdn.microsoft.com/zh-cn/library/ms178581.aspx) – 2011-11-04 15:56:17

1

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

使用通过.ashx查询字符串所需的任何参数来处理你想要的,因为HttpContext不会有你需要的。你几乎不能访问应用程序对象。

幕后ASP.NET会为你创建一个从CLR池,而不是应用程序池中的线程,所以你有一个额外的性能增益IHttpAsyncHandler