2011-08-11 90 views
2

我的團隊正在開發一個ASP.NET應用程序,其中包含一個導入功能。導入通常會由用戶在網頁中輸入一些設置(包括要導入的本地文件)啓動。當用戶點擊「導入」時,該文件應該被上傳然後導入。ASP.NET應用程序的後臺作業

導入操作可能相當長,所以不可能直接從aspx.cs代碼執行,它需要以某種背景方式完成。同樣重要的是,一旦文件上傳,導入不會丟失。我還希望導入立即開始,而不必等待每隔X分鐘檢查一次可用工作的服務或計劃任務。

什麼我發現作爲替代迄今:從線程池

  • 後臺線程或ASP.NET類似。將主要工作,但如果應用程序池被回收,則工作將丟失。
  • 帶定時器的服務,該定時器定期檢查數據庫中的工作表並運行導入。將工作,但無論是延遲還是導致從數據庫非常頻繁地請求工作。
  • 帶有更改通知查詢的服務(不知道確切的名稱,但可以訂閱來自SQL服務器的更改)。
  • 服務通過MSMQ獲取工作項目。
  • WCF服務,託管在系統服務中,不在ASP.NET內以避免回收。無論是從ASP.NET內部調用WCF服務,還是直接通過AJAX從客戶端公開調用WCF服務(如果非IIS託管的WCF可以公開AJAX端點)。

有沒有其他的選擇?有沒有人有上述選擇的經驗?

回答

2

你可以有一個windows服務,它監視上傳目錄的變化(例如使用FileSystemWatcher)。

這樣,在服務開始工作之前不會有(或只有很小的)延遲,並且您不需要服務中的任何種類的輪詢。

至於設置(由用戶輸入):將它們存儲在數據庫中(並從服務中查詢它們)或將它們寫入文件中。

0

正如你所提到的那樣,有不同的方法和選擇。

我們已經成功地使用了一個Windows Service作爲代理(作業管理器),並創建了種類爲Worker的類,它們插入並配置了一個小的ASPX頁面,而不需要在添加新工作人員時觸摸代理。

通過這種方式,代理總是以Windows服務的形式運行,並且根據工作人員的類型及其配置,它調用worker的執行方法並執行作業。

你也可以有一個更簡單的設計,就像你說的MSMQ一樣,我們也使用並且工作正常。

0

這與根據我們要求的用戶的電子郵件報告類似。

  1. 用戶通過Web應用程序請求報告,該報告將記錄添加到隊列表中。
  2. Windows服務監視隊列表並根據報告生成報告(基於報告類型可能需要數秒時間)。
  3. 另一個Windows服務一旦準備好就將電子郵件發送出去。

#2和#3都定期檢查數據庫(每個數據庫用於排隊項目的相關「狀態」),並將所有排隊但未處理的項目作爲批處理 - 一次處理一個。

0

調用實際工作的CLR存儲過程的數據庫觸發器?

雖然我對MSMQ有很好的體會,但是不要讓MSMQ超載太多的數據。發佈import-id:s或類似於MSMQ並將實際有效負載存儲在數據庫表中。 MSMQ可以處理相當多的數據,但大多數管理工具變得非常慢,因爲它們傾向於在啓動時查看隊列中的所有消息(包括有效內容)。