2008-12-18 18 views
5

我希望有人能指導我,我堅持......我需要編寫通知緊急工作站,並在彈出一個小消息緊急廣播系統用戶屏幕的底部。這似乎很簡單,但是在多個子網上有大約4000個工作站。該系統需要幾乎實時,輕量且易於部署爲Windows服務。最新最好的方式將事件發送到所有工作站

當我發現路由器不轉發UDP廣播數據包x.x.x.255時,問題就開始了。後來我在VB6中做了一個簡單的測試鉤來捕捉網絡發送消息,但是即使那些沒有通過路由器。我還編寫了一個簡單的數據包嗅探器來過濾數據包,只是發現網絡數據包從未到達預期的目的地。

然後,我接過來一看,並使用MSMQ HTTP上的探討,但要在目標工作站上安裝此所需的IIS。由於有這麼多的工作站,這將是一個重大的安全問題。

現在我已經完成了一個異步回調的Web服務,它向訂閱者發送一個事件。它在小範圍內完美運行,但一旦超過15個用戶的性能就會大大降低。輪詢服務器是不是一個真正的選擇,因爲負載會在服務器上生成(加上我已經試過了太)

我需要你的幫助來指導我一下,用什麼樣的技術。有誰使用過這麼多客戶的彗星方式,還是應該看看WCF?

我正在使用Visual C#2005。請幫助我擺脫這種困境。

謝謝

+0

你不需要MSMQ的IIS ... – 2009-01-18 05:55:58

回答

3

考慮使用WCF回調機制和事件。 Juval Lowy有good introduction

另一種模式是執行blocking web-service calls。例如,這就是GMail聊天的工作原理。但是,您將不得不在這裏處理會話和超時。它適用於客戶端位於NAT和防火牆後方且無法直接訪問的情況。但是對於Intranet中的簡單警報,它可能太複雜了。

0

這個問題我認爲最好用socket解決。

打開與服務器的連接並保持打開狀態。

+0

打開到服務器的連接工作。打開4000個插座可能會有效,但恐怕它不會太好。 – Piskvor 2008-12-18 10:06:54

0

你可以在該負責子網分配消息發送給所有客戶端每個子網從服務器?

然後,您可以只將從站連接到啓動消息的中央服務器。

+0

你是對的,但我不認爲我可以得到硬件。有大約50個子網,這意味着一臺服務器與每個udp客戶端有50個tcp連接。所以我需要客戶端能夠爲奴隸「提名」自己,以防工作站重啓/等。你會推薦WCF嗎? – Tyler 2008-12-18 09:47:06

+0

它可能成爲一個配置噩夢 – 2008-12-18 09:59:49

0

我想你們中的一些是大大這得太多。 Windows的每個版本都已經有一個服務,它提供了這個確切的功能!它被稱爲信使服務。您所要做的就是確保此服務已啓用並在所有客戶端上運行。

(雖然你沒有在問題中指定,我從你的技術的選擇,這個網絡的客戶羣是所有Windows假設)。

您可以使用像這樣使用這個設施的命令行發送郵件:

NET SEND computername "This is a test message" 

的NET SEND命令也有自己的選擇按名稱發送由Windows域,或特定的用戶,無論他們在哪裏已登錄或連接到特定Windows服務器的每個系統。這些選項可讓您輕鬆避免子網問題,特別是在您的網絡上使用基於域的安全性時。 (如果您通過服務器發送消息而不直接發送給客戶端,則可能需要在某些服務器上啓用「Alerter」服務)。

這個程序化版本是一個名爲NetMessageBufferSend()的API,它非常簡單。對P/Invoke.net的快速掃描發現page for this API不僅提供了需要調用API的定義,還提供了C#示例程序!

根本不需要編寫任何客戶端代碼。可能涉及最多的事情是找出對此API的最佳調用集合,以便在您的配置中完整覆蓋網絡。

ETA:我剛剛注意到Messenger服務和此API在Windows Vista中完全沒有了。微軟很奇怪完全刪除這樣的功能。它似乎是Vista的this vendor has a compatible replacement

3

這正是Multicast的設計目的。

正常網絡廣播(按定義)停留在本地子網上,不會通過路由器轉發。

另一方面,多播傳輸可以有各種範圍,從本地子網到本地站,甚至全球範圍。您需要的只是將各個子網連接在一起的各種路由器都可以識別組播。

相關問題