我有一個ASP.NET MVC 2測試版應用程序,我需要阻止特定操作的傳入請求,直到我有一些可用的數據返回或僅在30秒後釋放請求並且沒有新的可用數據。IIS請求如何使用COMET進行並行化?
爲了做到這一點,我使用的是AutoResetEvent.WaitOne(30000);
最大的問題是,IIS似乎並沒有被接受任何新的請求,而線程被阻塞在WaitOne
指令。新的請求會掛起,直到線程釋放。
我需要能夠並行請求,同時仍然保持WaitOne
行爲。
我有一個ASP.NET MVC 2測試版應用程序,我需要阻止特定操作的傳入請求,直到我有一些可用的數據返回或僅在30秒後釋放請求並且沒有新的可用數據。IIS請求如何使用COMET進行並行化?
爲了做到這一點,我使用的是AutoResetEvent.WaitOne(30000);
最大的問題是,IIS似乎並沒有被接受任何新的請求,而線程被阻塞在WaitOne
指令。新的請求會掛起,直到線程釋放。
我需要能夠並行請求,同時仍然保持WaitOne
行爲。
異步處理程序是你正在尋找的。如果你正在構建一個彗星解決方案,你可能想看看我們的彗星服務器的實現,它會爲你節省一些時間。如果你想推出自己的產品,那麼肯定需要使用異步處理程序來避免在超過60或70個用戶時遇到上併發限制,但即使使用異步處理程序,仍然必須做一些奇特的步法。基本上,你仍然會在線程池中達到一些上限,除非你將請求交給一個有界的線程池,這個線程池可以基本上管理你所有的傳入請求。
祝你好運!
根本不應該阻止傳入的請求。如果你需要的數據還沒有準備好,那麼返回一個空的響應,或者返回一個錯誤代碼。
約翰,我實際上正在研究一個基於Comet的應用程序,所以這種行爲是有意實現的,以避免壓倒大量服務器的連續請求。 – 2009-12-08 00:07:00
COMET與阻塞線程有什麼關係?改爲使用異步頁面,並且您的響應將被延遲,而不會阻塞任何線程。 – 2009-12-08 00:28:15
另外,在你的問題中應該提到「COMET」。請修改您的問題以包含更多詳細信息。 – 2009-12-08 00:28:46
對於一個Web應用程序,更可取的是(不是硬規則)返回一條消息,告訴用戶稍後再次嘗試,因爲您想調用它的任何原因。
通過'等待'來阻止/阻止請求並不會真正起到很大的幫助,因爲等待是不確定的,除非你有一個機制來實現它。
我不知道您的網站的性質/上下文/流量模式。 30秒可以是一個適合你的號碼。也許我上面的觀點並不相關,只是我的2分。
事實上,事實證明,這種行爲只發生在ASP.NET MVC 2 Beta中。我有這與MVC 2預覽版2工作正常,並回滾到此版本重新測試,並確認該應用程序適用於該版本的罰款。
現在,問題是:爲什麼我會在這兩個MVC發行版本之間看到這種不同的行爲,以及我在這種情況下應該得到的正確行爲是什麼?
我強烈建議你問微軟這個問題,而且你很快就會解決問題。 – 2009-12-08 16:29:40
我在codeplex上發佈了一個問題(http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=5034) – 2009-12-08 23:41:05
在ASP.NET中阻塞事件通常是不受支持的,因爲框架在您的對象上鎖定了對象代表。例如,如果兩個客戶共享同一個會話,他們的請求將被序列化。這可能很容易導致死鎖問題,這可能是你正在經歷的。 誰負責給你的事件發信號,這個代碼是什麼樣的? *代碼能夠執行嗎? – Levi 2009-12-09 02:34:07
感謝您的信息。 WebSync解決方案似乎是一個不錯的選擇。但是,我願意推出自己的解決方案,或者使用一些免費組件,而不願爲此付費!無論如何,感謝您的寶貴信息! – 2009-12-08 16:22:40
看起來像AsyncControllers是要走的路,因爲在這種情況下,等待句柄不被正式支持。 – 2009-12-14 17:29:10