2012-10-04 86 views
3

我目前正在研究利用的異步/ AWAIT功能:寫一個異步控制器和更新進度

  1. 提交的文件。
  2. 該文件例如可能包含一個或多個條目。 (例如,可能是僅包含一個元素的XML文件,或者每個文件可能包含多個節點)
  3. 我需要分別處理每個呼叫,將其添加到已完成項目的列表中,並且一次返回進度一個單獨的任務完成。 (已完成:0/2 ---->已完成1/2 ...)
  4. 這需要發送回視圖,以便使用此功能的用戶可以看到已導入的單個呼叫。

爲了實現這一點,我將使用Json異步更新頁面/進度條。

我預見到的問題是這樣的:

當我打電話提交去一個控制器,我需要爲每個呼叫的響應。我不知道該文件中有多少個調用,直到我已經提交了該文件並完成了一些處理(以確定每個調用節點)。是否有一個乾淨的方法來獲得我添加到列表中的每個已完成項目的回覆?

回答

8

不幸的是,asyncawait不能這樣做。正如我在我的博客上解釋的,async does not change the HTTP protocol;每個請求都會得到一個響應,就是這樣。

因此,提交文件時,爲該文件創建某種標識符並將其提交給持久背景隊列進行處理。您可以使用輪詢/長輪詢/ websockets/SignalR來通知客戶進度。

請注意,如果ASP.NET沒有未完成的請求,ASP.NET會假定您的進程可以被回收,因此處理應該由其他比您的MVC控制器完成。像Win32服務或Azure工作者角色一樣。

此外,如果這用於Web場中的站點,則需要從所有Web服務器都可以訪問持久隊列。如果您在Azure Web角色上託管,則它不能位於磁盤(或MSMQ)上,因爲Azure將回收您的整個計算機 - 在這種情況下,它應該位於Azure存儲或Service Bus中。

2

不確定您的具體要求是什麼,但您可以使用適合賬單的現成上傳控件,例如Telerik MVC上傳擴展及其免費!

http://demos.telerik.com/aspnet-mvc/upload

,或者你可以自定義滾你自己的一個;我在想的是,當用戶上傳XML文件/文件時,控制器方法可以將它們放入後臺隊列進行處理,或者將它交給一個負責處理的窗口服務,並返回一個或多個票號客戶端。公開另一項webservice/restful服務,通過票號向上傳查詢文件的進展/狀態,讓您的客戶/網站間隔查詢web服務以獲得進展並向用戶顯示進度。

想想你會發現使用現有的MVC上傳擴展更容易,所以不需要重新發明輪子,我的想法任何方式:-)