2010-03-09 225 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