2012-10-12 31 views
5

我們有一個傳統的第三方工具(用C/C++開發)。該工具有一個服務器組件,運行一個運行作業的Windows服務器(複雜的鏈式長數據庫查詢)。它還具有安裝在所有用戶桌面上的客戶端模塊,用戶將能夠添加作業,查看正在運行的作業及其進度,刪除作業,即基本管理作業。我們想要使用.NET技術在內部開發這樣的工具。如何在.NET中構建此客戶端/服務器應用程序?

目前,我們正在考慮如何構建這樣的工具,像我們缺少的拼圖的一些關鍵部分出現。

客戶端:我們決定在客戶端桌面應用程序在WPF

服務器開發:目前,我們正在考慮開發它作爲控制檯應用程序,但不太清楚如何構建它。

的主要問題,我們有是

服務器控制檯應用程序如何可以公開ASMX或WCF Web服務(使WPF客戶獲得作業的狀態),同時繼續運行的作業?

如何從服務器推送最新進展的WPF客戶端時有變化?

我們正在努力做研究如何做到這一點,但沒有找到相關的主題的任何東西。任何指向文章/指導的指針都將非常有幫助。

+0

可能的重複:http://stackoverflow.com/questions/11170457/discussion-client-server-application-architecture –

+0

@MikeMcCaughan您提到的鏈接似乎是相似的,但它不是,在我的情況下,我的服務器除了爲客戶提供服務外,還有很長時間的工作要做。 – Aron

+0

試試這個:http://dasunhegoda.com/architecture-products/1180/ – Techie

回答

3

你有這種混亂是假定任務的執行和WCF端點是一樣的。我將它分成三個主要項目:

  1. 具有用於作業管理的UI元素的客戶端應用程序。
  2. WCF服務端點檢索作業信息併發送創建/刪除作業請求。
  3. 運行作業的應用程序。

客戶端應用程序

客戶端應用程序應通過WCF服務檢索作業數據。您將提供屏幕查看執行作業/創造就業機會/刪除作業/等

WCF服務

的WCF服務將公開由客戶端應用程序所需的端點。這可能包括諸如以下項目:CreateJob,ViewJobs,DeleteJob等。該服務應該讀取/寫入您的數據庫後端。

求職

申請工作將輪詢新/刪除的作業並執行一切必要的工作來完成。它將更新WCF服務讀取的數據庫後端的作業狀態。這可能是一個SQL作業,Windows服務,控制檯應用程序,等等,(我可能會讓它成爲一個Windows服務,因爲你可能需要一直在運行的東西來處理作業)。

問題

How can a server console application expose ASMX or WCF web services(so that WPF clients get the status of the jobs) WHILE CONTINUING TO RUN THE JOBS?

通過運行該被取消職位的申請分離出WCF服務。注意:您可以擁有託管WCF和作業執行程序的控制檯應用程序,但在概念上將它們視爲單獨的東西(託管在相同的控制檯應用程序中僅僅是一個實現細節)。

How to push progress updates from server to the WPF clients when there is a change?

我不會這麼做。我會讓UI不時輪詢或提供刷新按鈕以通過WCF端點檢索狀態。

如果您絕對需要這樣做,您需要Job執行者在運行作業時發佈消息,並且客戶端應用程序需要接收這些消息(可能是MSMQ,Service Bus Implementation,BizTalk等)。

爲什麼我喜歡輪詢服務器推送

現在,我想它有可能情況下,我會做俯臥撐的風格,有些地方我投票。

如果我有很多異地客戶端(通過VPN或通過互聯網連接),我會讓客戶端進行輪詢,因爲帶寬和網絡延遲成本過高。如果客戶端數量很高,則每條更新消息都需要發送給每個訂閱客戶端。在這種情況下,我傾向於去詢問不告訴模型。

如果客戶在家,你需要實時的信息流,那麼推送模式會更有意義。在這種情況下,客戶端可以連接到服務器應用程序,他們可以通過連接來回發送消息(我沒有親自做過這個,所以我沒有建議如何設置,希望比套接字更高級別)。

如果這是一種情況,您希望消息作爲更新發生,但客戶端位於許多不同的地方,那麼發佈/訂閱模型可能是最好的。在pub/sub中,應用程序會在更新消息發生時推送消息。消息傳遞系統將檢查是否有任何訂閱消息的客戶端,並且所有訂閱消息傳遞系統的客戶端都將消息的副本轉發給它們。在你的例子中,一個客戶端將subscribe作爲消息,消息系統會將更新發送到客戶端指定的位置(客戶端需要一種接受消息的方式)。NServiceBus,BizTalk是這種類型的通信的例子。

+0

感謝您的詳細解釋。非常接近我在找的東西。你能解釋爲什麼你比服務器推送更喜歡輪詢嗎? – Aron

+0

用更多的想法擴大了我的答案。從較高的層面來看,我傾向於因爲舒適和熟悉而進行投票。我主要工作在Web應用程序上,這些應用程序適用於請求響應模型。 –

1

聽起來就像你問的有關WCF服務的託管選項。共有四個選項:

  1. 自託管在託管應用程序 - 即創建一個控制檯應用程序,另一個WPF應用程序等是再創建一個服務,並保持它活着,而它(控制檯應用程序)還活着。
  2. 託管的Windows服務 - 創建一個可以由Windows自動啓動時
  3. Internet信息服務(IIS)來啓動Windows服務 - 同樣承載它到ASP.NET服務
  4. Windows進程激活服務(WAS) - 新的激活服務,我沒有親自使用它。

全部細節here

要完全回答你的問題,我不會用ASMX服務。有一個很好的理由,請參閱this question

相關問題