2014-01-11 76 views
5

我在ASP.NET MVC中實現了一個簡單的PDF上傳器,我需要處理上傳的文檔。由於處理過程可能需要一段時間,我希望這可以在後臺完成。 工作流程如下: 我希望用戶上傳文檔,當文檔保存在數據庫中時,他應該能夠在網站上做其他內容,包括上傳新文檔。用戶不應該知道後臺處理的任何內容。開始後臺任務ASP.NET MVC 4.5

我的實現看起來是這樣的:

[HttpPost] 
public async virtual Task<ActionResult> Confirm(string author, string title) 
{ 
    //... 
    previousDocumentIsProcessing = true; 
    await InvokeDocumentProcessor(_document.Path, _document.DocumentID); 
    previousDocumentIsProcessing = false; 

    return View("Success"); 
} 

的問題是,處理完成後,顯示「成功」的觀點。由於操作是異步的,用戶可以點擊並執行其他操作,但是我想要創建後臺進程,啓動它並立即顯示「成功」視圖。用戶不應該被處理困擾。

我該如何做到這一點? 我已經嘗試過後臺工作,但它沒有工作(我得到錯誤說異步過程不能在這一點開始)。

回答

6

用戶不應該對後臺處理有任何瞭解。

確定嗎?如果在處理過程中出現錯誤會怎麼樣?用戶如何知道處理完成的時間?

我該如何做到這一點?

正如我在我的博客上解釋的async does not change the HTTP protocol

正確的解決方案是將上傳的文件保存在某個地方(例如,Azure blob存儲),將消息插入可靠的消息隊列(例如Azure隊列存儲),並擁有一個完全獨立的後端進行處理(例如,Azure工作者角色)。

如果你想要一個不正確的(內存)解決方案,我有another blog post describing that approach

+0

我敢肯定,因爲所有我做的是提取PDF格式的內容(一字一句),並將其保存到用戶不應該知道的處理數據庫,以使上載的文件可搜索。 Windows Azure上的解決方案聽起來非常好,但這是一個簡單的大學項目,使用Windows Azure不是一種選擇。我將研究「不適當」的解決方案並回復你。感謝您的回答:) – mobearette

+0

您可以讓Windows服務或控制檯應用程序執行與Azure輔助角色相同的操作。斯蒂芬只是建議實施該模式。 –

+0

正確。 Azure示例僅是示例。您也可以使用(分別):本地文件系統,MSMQ(或本地數據庫)和Win32服務。 –