2011-08-12 8 views
1

Webクライアント(ASP.NET MVC)でリアルタイム更新が必要な要件があります。私がそれを回すことができる唯一の方法は、COMETテクニック(ServerPush/Reverse-AJAX)テクニックを実装することです。WCF Comet実装

シナリオは次のとおりです。 ユーザーA別のWebサイトクライアントにメッセージを保存します。その後、ユーザBは、ユーザ "A"によって異なるブラウザで自動的に更新されます。

は、私が実際にこのアーキテクチャにより、溶液仕上げ: ASP.NET MVCを - WCF上(ロングプール)jqueryのアヤックス(ポスト)要求をしました。 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(); 
} 

私の関心や疑問がある:は、(1秒間隔で)WCFにポーリング技法を行うための最善のアプローチですか?

原因:データベース接続プーリングの使用を最大限に高めました。そのテクニックに問題はないと私は期待しています。

注:これは、下記のWCF属性を使用したマルチスレッド実装です。

答えて

0

データベースをポーリングするnsteadでは、代わりに更新時にイベントが送信されますか?とにかく私はPub/Subシナリオを実装した方法と同じように、それは素晴らしい作品です。

+0

ところで、自分でホストされているWCFサービスやIISでホストされているサービスはありますか?後で問題が発生した場合、IISはパブ/サブシナリオでは機能しないリクエストをキューに入れると、同時スレッドレベルが15以下と非常に低くなります。 – 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 Cometソリューションは、FrozenMountainにはIIS用WebSyncサーバーがあります。 PokeInもあります。

realtime web technologiesのリストもコンパイルされていますが、これも便利です。

+0

私は実際にWebSyncを研究しました。そして、私はそれがMS Stackのために提供される最高のCOMETサービスであることを知っています。私は自分のウェブサイトにサードパーティ製のdll(サービス)を購入することを避けていますが、これらを使って、構成の容易さで全二重通信用のWebSyncライセンスを購入することが良いと思うかもしれません。 – Mike

+0

サードパーティのソリューションを検討している場合、We(Pusher)には.NETアプリケーション(ASPを含む)に簡単に統合できる[.NETライブラリ](http://pusher.com/docs/rest_libraries#cs)もあります。 NETとASP.NETのMVC)。それを使用しての書き込みもあります[ここ](http://blog.pusher.com/2011/6/25/the-easiest-way-to-add-real-time-functionality-to-an-asp -net-eコマースアプリケーション)。自分自身をホストし、WebSocketではなくCometが必要な場合(WebSocketsを推奨します)、WebSyncは優れたソリューションを提供します。 – leggetter