2011-08-12 107 views
1

我有一個需要Web客戶端(ASP.NET MVC)上的實時更新的需求。我可以解決的唯一方法是實施技術(ServerPush/Reverse-AJAX)技術。WCF彗星實現

該場景是: 用戶A在不同的網站客戶端保存消息。然後,用戶B將自動獲取由用戶「A」在不同瀏覽器中進行的更新。

我真正完成這個架構的解決方案: ASP.NET MVC - 確實在WCF一個jQuery AJAX(POST)請求(長池)。 WCF - 在間隔1秒的時間內對數據庫(SQL Server)進行一些輪詢。如果新數據已添加到數據庫中,則輪詢與客戶端上返回的數據中斷。

WCF COMET方法僞代碼:

private Message[] GetMessages(System.Guid userID) 
{ 
     var messages = new List<Message>(); 
     var found = false; 
     /* declare connection, command */ 
     while (!found) 
     { 
      try 
      { 
       /* open connection - connection.Open(); */ 
       /* do some database access here */ 
       /* close connection - connection.Close(); */ 
       /* if returned record > 0 then process the Message and save to messages variable */ 
       /* sleep thread : System.Threading.Thread.Sleep(1000); */ 
       found = true; 
      } 
      finally 
      { 
       /* for sure, incase of exception */ 
       /* close connection - connection.Close(); */ 
      } 
     } 
     return messages.ToArray(); 
} 

我的關心和問題是:是它做在WCF輪詢技術的最佳方法(1秒間隔)?

原因:我最大限度地使用了數據庫連接池,並且我期待這個技術沒有問題。

注意:這是一個多線程實現,使用WCF給定屬性如下。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall), ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = true)] 

回答

0

輪詢nstead數據庫中你不能有更新,而不是當發送的事件?這就是我實施Pub/Sub場景的方式,而且效果很好。

+0

順便說一下,你有自己託管的WCF服務或IIS託管的嗎?如果後者出現問題,則IIS的併發線程級別非常低,大約15個左右,之後它將對請求排隊,這在pub/sub方案中不起作用。 – Anders

+0

是的,我是一個自託管的WCF服務(IIS託管)。我試圖通過在SQL Server 2008中啓用Service Broker服務來使用SqlDependecy對象,它工作正常,並且觸發數據更改返回給客戶端。但是,DBA告訴我不要使用它,因爲線程和開放式服務監聽器有一些限制(最大限制未定義)。你有什麼想法分享如何實施適當的COMET服務? – Mike

+0

你能分享一下WCF COMET實現的確切方式嗎?謝謝! – Mike

4

我建議使用專用的實時服務器(即不要在IIS中託管WCF服務)或使用託管服務進行實時更新。正如Anders所說,IIS在處理多個長時間運行的併發請求方面並不是那麼棒。

我還建議你看看使用一個解決方案,它使用WebSockets支持回退解決方案,如Flash,HTTP流,HTTP長輪詢,然後可能輪詢。 WebSocket是客戶端和服務器之間全雙工雙向通信的第一種標準化方法,最終將爲任何此類問題提供更好的解決方案。

目前,實施您自己的Comet/WebSockets實時解決方案肯定是一項耗時的工作(您可能已經找到了),尤其是在構建面向公衆的應用程序時,用戶可以通過羣體不同的瀏覽器。

考慮到這一點,XSockets項目看起來非常有趣,SuperWebSocket項目也非常有趣。

我知道.NET彗星解決方案是從FrozenMountain有IIS的WebSync服務器。還有PokeIn

我編制了一個列表realtime web technologies也可能是有用的。

+0

我實際上研究過WebSync,我知道它是爲MS Stack提供的最好的COMET服務。我只是避免爲我的網站購買第三方dll(服務),但對於這些,我想我可能需要考慮購買用於全雙工通信的WebSync許可證,並且易於配置。 – Mike

+0

如果您正在考慮第三方解決方案,那麼We(Pusher)也有一個[.NET庫](http://pusher.com/docs/rest_libraries#cs),可以很容易地集成到任何.NET應用程序(包括ASP)中。 NET和ASP.NET MVC)。還有一篇關於使用它的文章[這裏](http://blog.pusher.com/2011/6/25/the-easiest-way-to-add-real-time-functionality-to-an-asp -net的電子商務應用程序)。如果你想自我託管,你想要Comet,而不是WebSockets(儘管我推薦WebSockets),那麼WebSync提供了一個很好的解決方案。 – leggetter