2011-12-15 83 views
16

我有一個項目需要在服務器發生問題時通知WPF桌面客戶端。另外,向WPF客戶端發送的通知不會被廣播(發送給每個客戶端),它應該發送給特定的客戶端。調查從服務器通知WPF客戶端的解決方案

我想遠離老式的服務器輪詢。這需要儘可能接近實時。

我從來沒有這樣的要求,我正在研究解決方案。我的第一個想法是使用SignalR.NET client。我還沒有與SignalR合作過,但似乎它可能是一個解決方案。我知道這是對長輪詢,服務器發送事件和WebSocket的抽象,取決於可用的內容。

我已經通過Callbacks和服務總線簡單閱讀了WCF,但對它們一無所知,或者這些技術是否適用於此。我可以使用之前解決此問題的人員的一些反饋和建議。你會怎麼做?

+0

受控網絡中的客戶端和服務器之間的連接,還是通過「雲」? – 2011-12-15 19:23:30

+0

@Mike - 假設它是一個局域網。 – 2011-12-15 23:45:19

回答

0

這個問題很有趣。

我們目前正在開發一個與多個Web服務交互的應用程序。其中一個要求是每個客戶必須瞭解其他客戶所做的行爲。

爲了實現這一點,我們正在考慮創建一個Web服務,其目的只是建立一個客戶端列表來通知,並處理通知誰,通知的時間和內容的邏輯。客戶在啓動時將向該服務註冊。通知本身將使用您提到的回調來完成。

使用完全獨立的Web服務背後的原因是因爲我們現有的所有服務都需要在每次調用時建立連接並將其斷開。使用通知Web服務時,只要客戶端運行,就必須保持連接。

對不起,我無法提供更多幫助,因爲我們正在自行開發這樣的系統。我也有興趣獲得有關此主題的反饋。

7

這可以用WCF和duplex contracts很容易地完成。您可以定義客戶端可以在服務器上執行的操作(如任何Web服務),此外還可以定義服務器可以在客戶端上執行的操作(即反向Web服務)。明智的代碼,它們都只是簡單的方法調用。客戶端具有調用服務器上的操作的方法,並且它還必須提供實現回調協議的對象,該對象是服務器可以調用的接口並且客戶端必須提供實現。所有數據和消息的序列化/反序列化以及所有低級網絡操作都由WCF處理,因此您不必擔心。

WCF支持雙面合同使用兩個綁定(或「協議」):

  1. WSDualHttpBinding - 這需要兩個基於SOAP的HTTP監聽器,一個在服務器和一個客戶端上。當客戶端想要聯繫服務器時,它會對服務器執行HTTP請求。當服務器想要聯繫客戶端時,它會向客戶端執行HTTP請求。這種方法的優點是任何網絡連接都是短暫的,並且不會保持開放(與大多數HTTP連接一樣),因此它可以支持大量或併發的客戶端。主要的缺點是,它可能不適用於互聯網上的大多數客戶端計算機,因爲它們通常位於NAT之後(對於通過互聯網進行的服務器到服務器通信或內部網或局域網內的任何通信) 。有關更多詳細信息,請參閱我的other answer

  2. NetTcpBinding - 這基本上打開一個從客戶端到服務器的套接字並在會話期間保持打開狀態。這樣即使通過NAT也可以進行雙向通信,但由於連接必須保持打開狀態,因此服務器上的負擔有所增加,因此能夠支持較少的併發用戶(但在大多數情況下可能仍然綽綽有餘)。這是我在WCF上執行雙面合同的首選方式,因爲它更容易工作並且更可靠。

WCF的好處是,你可以在不改變代碼的兩個綁定之間進行切換。所需要的只是更改配置(.config文件)。

您選擇哪種方式,你就可以進行雙向近乎即時通信(網絡延遲允許,當然)。當您擁有如此豐富,功能強大且易於使用的用戶框架(如WCF)時,我認爲不需要SignalR。如果你在瀏覽器中運行受到限制,那麼SignalR將有意義。由於你在.NET中運行,它只會引入不必要的摩擦。

+1

我將更多地關注WCF的這個領域,但是我考慮SignalR的原因是因爲我的經驗是WCF引入了不必要的摩擦。 – 2011-12-15 23:49:00

3

你應該看看WebSync從冰封山。我以前用過它,效果很好。它可以滿足您的所有需求。他們甚至提供託管服務'WebSync on Demand'。他們也提供免費產品(但最多可同時支持10個用戶)。 這是一個商業產品。如果你不想做所有的管道工程,WebSync爲你準備好使用API​​,你可以開始使用並快速開始。 我聽說過/已閱讀過有關SignalR,還沒有使用它,但SignalR似乎在alpha/beta中,而WebSync非常成熟。

0

您可以創建一個WCF服務,而WPF客戶登記themselve在啓動時。然後每個wpf都可以與msmq或rabbitmq服務器進行通信,在這裏他們將根據客戶端名稱/唯一標識輪詢自己創建的隊列。在服務器端,您可以擁有一項服務,該服務會根據爲每個客戶端設置的條件提供數據,從而將數據推送到隊列中。

+0

我不想投票。 – 2011-12-15 23:49:38

4

像SignalR技術的關鍵是滿足服務器和Web客戶端之間的實時通信的需求。他們利用WebSockets,並回退到老的瀏覽器的舊/黑客通信機制。

如果您的環境將是一個LAN和您的客戶端NET應用程序,那麼你可以使用一個TCPSERVER和多個TCPClients。當您的Web服務器有更新/消息發送時,告訴您的TCPServer(也許通過在它正在監聽的消息總線上放置一條消息)來通知連接的客戶端。實時網絡技術是這樣做的一個好辦法,但它實際上取決於你目前的要求是什麼,什麼你的未來計劃是:

  • 你想嘗試SignalR - 如果是的話,那」你會工作,你可能會有很多樂趣。它可能對未來的項目也很有用,並且是一個很好的選擇。如果否,TCPClient和TCPServer方法可能會超級簡單並且更快。
  • 你有其他類型的Web客戶端,以便能夠接收將來的通知的要求? - 是的,SignalR或其他更成熟的self hosted realtime web technology可能是更好的解決方案。否 - TCPServer /客戶端
  • 您是否打算將數據分發到局域網之外?是的 - 一個自我託管的選項或事件hosted solution與.NET庫可能會去,因爲他們刪除維護開銷(免責聲明:我工作Pusher誰提供這樣的服務)。無自我託管或TCPServer /客戶端。
  • 速度有多重要?如果它真的真的很重要,那麼一個絕對沒有開銷的TCP連接將是最快的選擇。次優選項將是WebSockets,然後是HTTP Streaming,然後是HTTP Long-Polling。

注:雖然我說TCPSERVER/Client可能是我想強調的是,它也可能不是是最簡單的方法。的WebSockets是一個非常激動人心的技術,在許多方面更容易獲得比的TcpClient技術,因此可以成爲任何服務器和客戶端之間的雙向通信的主導技術 *

我不能雙面合同發表評論,但我的理解是他們建立的聯繫並沒有持續下去,所以他們實際上是一個投票解決方案 - 我可能是錯的。

3

我還在評估使用pub/sub服務將事件傳遞給WPF客戶端的輕量級且簡單的方法。我不需要有保證的消息傳遞,所以像MassTransit或NServiceBus這樣的解決方案似乎太重,因爲它們需要隊列可用(MSMQ或其他)。我也有要求解決方案可以作爲.NET 4.0 客戶端配置文件

構建在WCF上的一種似乎可行的解決方案是nvents。我不確定該項目是否仍然活躍。它很容易使用,底層實現(WCF)很好地抽象出來。沒有討厭的配置要求。

我在Per Brage的Blog上遇到的另一個解決方案使用SignalR和Reactive Extensions。我還沒有嘗試過他的實現,我不確定它是否需要完整的配置文件,但是是一個很好的閱讀!

相關問題