我建立一個ASP.NET MVC site在客戶端(瀏覽器)可以使需要長達30分鐘API調用(或更多..)處理。很明顯,我不能使用普通的MVC控制器來做到這一點,因爲一些這樣的請求會阻止我的所有IIS工作線程阻止其他更快的呼叫。ASP.NET MVC異步控制器VS服務器推送(COMET /反轉Ajax)
我看着下面兩個選項:
- ASP.NET MVC的異步控制器
- PokeIn庫允許服務器推送通過反向AJAX(長期持有舊版瀏覽器的HTTP請求)或WebSockets的(從較新的瀏覽器的HTML5規範)
現在這兩個似乎是一個很好的可行的選擇。
選項1似乎最容易爲我實現。使用異步控制器,我的IIS工作線程不會被阻塞,因此允許我的其他更快的API調用無縫地通過。然而從異步控制器documentation,我看,它產生一個非IIS線程這將被阻塞/等待我的長期運行的(30〜分鐘)的過程來完成。我已經讀過,「如果你阻塞或睡在控制器中,不管它是異步還是異步,它都是非常糟糕的。」
在方案2中,如果我的客戶在使用新的瀏覽器,它支持的WebSockets,這或許會是最高效的,因爲我並不需要對服務器端的任何阻塞線程。當客戶端觸發緩慢的API調用時,我會提出一個事件,在完成後(比如說30分鐘後),我會引發另一個事件來更新我的客戶端瀏覽器中的所有更新內容。 然而,隨着PokeIn庫,如果我的客戶的一部分,不具有的WebSocket支持的瀏覽器(舊的..),我不知道如果他們會佔用我的IIS工作線程之一。
是選項2我的要求矯枉過正? 在選項1中,讓我的異步控制器在慢進程中等待會不好? 選項1的另一個缺點是,如果用戶在請求完成之前刷新頁面,則一旦完成,他將不再獲取作業的更新!
歡迎任何想法,建議。
由於