2011-11-20 79 views
1

我知道涉及計劃任務runninng的模型,該模型在後臺運行使用web請求註冊的作業,但如何實現將所有內容都保存在ASP中的想法.net ...針對長時間運行的ASP.net MVC web請求設計

  1. 用戶上傳CSV文件,可能有幾千行。行被保存到數據庫中。我想這可能需要一分鐘左右,這將是一個可以接受的等待。

  2. 請求返回給瀏覽器,然後一個自動的Ajax請求將返回到服務器並且一次請求10行並處理它們。 (每行需要多個Web服務請求。)

  3. Ajax調用返回,顯示更新,然後另一個自動Ajax請求返回更多行。這一直重複直到所有行都完成。

  4. 如果用戶離開網頁,他們可能會返回並重新啓動作業。

有什麼想法?

乾杯,伊恩。

+2

嗯,不是問題的完整答案,但你有沒有看過[SignalR](https://github.com/SignalR/SignalR)項目。它是.Net持久連接實現的完美選擇。 – tugberk

+0

這看起來很酷。我想我可以運行一個長時間運行的請求,並從服務器獲取反饋。爲什麼網頁瀏覽器不會超時? –

+0

爲什麼你需要保持在一個asp.net請求? – Dallas

回答

2

如果我找到你的權利,你實際上不需要任何後臺作業和長時間運行的請求之間的「交互」,你只是想「招攬」後臺作業與傳入的請求?不是這樣一個好主意。看看Quartz.NET項目,它是調度程序可嵌入到ASP.NET應用程序中,它將爲您處理這些東西,而無需請求。當然,如果應用程序池關閉,您的調度程序也會關閉,但即使您的長時間運行的請求解決方案依賴於等待另一端的瀏覽器,也無法保證不會發生。

還採取從菲爾哈克有關這個主題的這個有趣的文章一看,用他自己的小計劃程序庫專用於ASP.NET:

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

1

的服務器端程序(或理想服務)可能仍然是快速和骯髒,並會更可靠。您仍然可以按照您的建議執行第1步,上傳文件並插入數據(不要忘記在web.config中增加maxRequestLength超時值)。然後在服務器上運行一個程序,檢查新記錄並處理它們。

如果用戶需要狀態,則可以在數據庫中爲每個文件存儲條目,並在導入完成時更新數據庫記錄。

+0

我想我會使用Windows Scheduler,所以我不會不需要重新實現定時器機制。另外,我可以將其配置爲一次只運行一個實例,以便我不必擔心數據庫鎖定。在此之前,我已經在服務和調度程序之間進行過辯論,我認爲預定的exe是正確的選擇。另外,如果我使用服務器端程序,那麼我可能會插入數據,以便Web請求儘可能快 - 它只會創建一個「任務」行並將csv文件粘貼在其中。 –

+1

也許我只是使用Quartz.net。 –

+0

Quartz.net是運行預定後臺任務的絕佳解決方案。很好的工作,你可以添加各種各樣的東西,如耐用的工作,集羣等。 –

0

也許我正在閱讀這個問題並以一種奇怪的方式解釋它,但爲什麼你不能將該文件讀入數據庫並在表中存儲完成的文件的當前行。然後你可以通過db跟蹤你的進度,併發送小json對象告訴用戶你有多遠。這樣,如果他們的連接下降,你可以繼續處理他們的請求,如果他們稍後返回,你可以通知他們工作的距離有多遠。另外,如果多個客戶端正在連接,則可以使用數據庫對隊列負載進行排隊和節制(通過序列化)。或者,如果用戶將中間作業連接到另一個文件,那麼他們的新請求將在他們當前的作業之後排隊。

+0

是的,這就是我現在要做的。 Web請求將作業傳遞給後臺進程,然後僅調用狀態報告。 –

相關問題