客戶希望有一個按鈕,從數以百計的記錄的外部源火了一個數據庫更新一個asp.net頁面。這個過程需要很長時間。他還希望在進程運行時進行狀態更新,如「處理1000條記錄中的10條」。在閱讀各種文章時,我正在考慮將數據庫更新代碼放入Windows服務中。我從來沒有使用過Windows服務,我找不到許多關於如何從一個asp.net頁面啓動一個windows服務並進行輪詢的教程。我的問題是這是處理這個過程的最好方法嗎?而且,有沒有人有他們如何完成這個任務的例子?如何斷火和輪詢從asp.net頁面窗口服務
回答
有接近這幾方面。
你說得對在執行網絡的工作進程中的長時間運行的任務通常不會有好下場:它佔用了資源,應用程序池可以得到回收,等等。在我的大部分任何複雜的項目,我通常最終得到4個部分:數據庫,我的模型的DLL,Windows服務的「工作人員」和ASP.NET網站。
的「工人」是一個Windows服務是始終運行,並使用Quartz.net執行使用該網站使用相同型號的計劃任務。這些可都是似乎突然出現維護任何一個複雜的網站時,各種各樣的週期性任務:VacuumExpiredPickTicketsJob
,BackupAndFtpDatabaseJob
,SendBackorderReminderEmailsJob
等
編寫Windows服務在C#中並不難(有一個內置的Visual Studio中的模板,但你幾乎繼承了ServiceBase
,並且你已經參加了比賽),而像TopShelf這樣的庫使它更容易部署。
而剩下的就是觸發從網站更新並將結果傳送回給用戶。這可以像你希望的那樣簡單或複雜。如果這種情況必須擴展到大量用戶,則可以使用類似MSMQ的內容將更新命令排隊到Windows服務,並且Windows服務將響應該隊列。我覺得這可能是過度殺傷的印象。
對於少數用戶,你可以重寫你的服務的OnCustomCommand(int command)
方法是觸發。然後,您的網站將使用ServiceController類的ExecuteCommand()
來啓動該過程。你的網站和服務會同意這個參數值,意思是「做更新的事情」,比如說142
(因爲歷史原因它必須是128到255之間的數字)。
至於將進度反饋給客戶端,最簡單的方法是讓Web頁面使用計時器和AJAX調用來輪詢更新的進度數據。您可以使用像WebSockets(我寫這篇文章時會出現的最新的內容)和long polling這樣的新內容,但是定期投票只會用於某些不需要擴展的內容。
希望這會有所幫助!
你是對的,MSMQ是矯枉過正和定期輪詢很好,但...你怎麼做從asp.net頁面的Windows服務定期輪詢?我知道如何使用ajax和一個定時器控件,但是我怎樣在windows服務上調用以獲取狀態? – user204588
我曾經想過DB方法,我只是想知道如果每次產品打900次DB會是瓶頸。 – user204588
除了Nicholas的全面回答之外,另一個選擇是將後端進程作爲命令行腳本部署,並安排它們通過Window內置的任務調度程序運行,該調度程序在Windows Server 2008+中已經有所改進。或者您可以使用任何其他主機的任務調度程序應用程序。
我發現命令行方法更容易讓MIS員工瞭解和配置,並遷移到新的服務器,而不是標準的Windows服務。
- 1. Android服務不斷運行和輪詢
- 2. 從ASP.NET開始/停止窗口服務錯誤頁面
- 3. 在apache窗口中服務lua頁面
- 4. wamp apache - 輪詢服務器不斷
- 5. 避免iPhone不斷輪詢Web服務?
- 6. 從窗口服務
- 7. 構建此輪詢窗口服務的哪個選項更好?
- 8. 創建一個C#窗口服務輪詢數據庫
- 9. 創建一個窗口服務來輪詢數據庫
- 10. 代表一個窗口服務在UML中輪詢數據庫
- 11. 從瀏覽器選項卡/窗口/頁面傳遞ID到服務器(ASP.NET MVC)
- 12. Asp.Net聊天服務器端輪詢
- 13. 如何從一個窗口服務
- 14. 不斷輪詢服務器從iOS應用程序新的JSON?
- 15. 如何在窗口服務
- 16. 如何unistall窗口服務
- 17. WCF服務輪詢
- 18. 從網頁輪詢數據庫? - ASP.NET
- 19. ASP.NET網絡服務和頁面方法
- 20. 如何使用Java RMI從Windows服務控制桌面窗口?
- 21. 如何保持輪詢綁定服務?
- 22. Visual C++和窗口服務
- 23. 如何在Behat + Mink中斷言頁面/標籤/窗口標題
- 24. 從Android客戶端輪詢asp.net MVC服務器
- 25. 從輪詢線程連接到遠程端口(服務器)
- 26. 如何從另一個窗口服務啓動Windows服務
- 27. 端選項窗口在ASP.NET頁面
- 28. 在新窗口中打開asp.net頁面
- 29. 在相同的端口輪詢服務器 - 線程和Java
- 30. 如何備份數據庫從服務器使用asp.net頁面
您可以使用Web服務來代替Windows服務。我已經完成並在此處發佈了博客:http://weblogs.asp。net/stevewellens/archive/2009/04/05/using-session-state-in-a-web-service.aspx –