1

.Net framework 4.5.2を使用しています.Webフォームアプリケーションのデスクトップアプリケーションから接続されているユーザーにWebアプリケーションからの通知を送信する通知システムの作成を開始します。調査の結果、適切なソリューションが、接続されたクライアントに通知を送信する前に、通知のフィルタリングをサポートするため、適切なソリューションがsignalRを使用していることがわかりました。SiganlRでの同時接続の処理

WebアプリケーションでHUBクラスを作成したときに、通知を受け取るためにサーバーに接続されているクライアントを検出するOnConnectedメソッドを実装しました。 (メモリ内の)辞書に登録されているユーザー私は、メモリ変数(辞書)に接続したユーザーを設定することは信頼できないため、プロダクションでは実装できなかったソリューションだと思います。私の場合、接続されたユーザーの数は20,000 以上であり、今後大きくなる可能性があります。接続されたすべてのユーザーを追跡する最善の方法を知っている必要があります。同時に、スケーラビリティの問題を起こさずに同時リクエストを処理するためのベット方法も必要です。私はこれで新しく、私は私の決定を非常に速くしてください。

また、ハブクラスでオーバーライドできるOnReconnectメソッドの使い方についても知っておく必要があります。

iisが何らかの理由でインターネットアプリケーションを再起動した場合に備えて、接続が失われないようにする方法も知っておく必要があります。

答えて

3

Mapping connections to usersはあなたが達成したいかに応じて、複数の方法で行うことができます

In memory storage:それをする
最善の方法は、concurrent dictionaryを使用することです。これはスレッドセーフな操作を可能にしますが、あなたが言ったように、膨大な数の接続に最適なソリューションではありません。

Permanent external storage
マッピングをデータベースに保存してください。
良い部分:マッピングは、複数のWebサーバー間で利用可能である
悪い部分:データベースおよび必要なクリーンアップの多くのストレスの多くは

Single-User Groups
一つのグループのために作成します。各ユーザー。これは最もシンプルで実用的なソリューションです。

良い部分:使用していて、最後の接続を削除すると
〜グループが削除された切断時にSignalRがグループからの接続を除去するのに十分スマートです〜
を実装する

〜本当に簡単
〜あなたはアイデンティティを使用する場合は、請求[1][2]としてユニークなグループ名を格納し、のようなものを使用してハブの内側にそれを得ることができます。

public static class IdentityExtensions 
{ 
    public static string GetSignalRUniqueGroup(this IIdentity identity) 
    { 
     var claimsIdentity = identity as ClaimsIdentity; 
     var claim = claimsIdentity?.FindFirst("uniqueSignalRGroup"); 
     if (claim == null) return null; 

     try 
     { 
      return claim.Value; 
     } 
     catch 
     { 
      return null; 
     } 
    } 
} 

(実際にはそうではない)悪い部分:あなたはどのユーザーがどのグループに参加するかに注意する必要があります。 !しないでください!は、クライアント側で結合グループ機能を実装します。代わりに、他の質問についてはグループ

public override Task OnConnected() 
{ 
    string userGroup = Context.User.Identity.GetSignalRUniqueGroup(); 
    if(userGroup != null) 
    { 
     Groups.Add(Context.ConnectionId, userGroup); 
    } 

    return base.OnConnected(); 
} 

public override Task OnReconnected() 
{ 
    string userGroup = Context.User.Identity.GetSignalRUniqueGroup(); 
    if(userGroup != null) 
    { 
     Groups.Add(Context.ConnectionId, userGroup); 
    }  
    return base.OnReconnected(); 
} 

public override Task OnDisconnected(bool stopCalled) 
{ 
    //You should not manually remove the user from the group when the user disconnects. 
    //This action is automatically performed by the SignalR framework. 
    return base.OnDisconnected(stopCalled); 
} 

への接続を追加するOnConnectedとOnReconnectedを使用し、あなたはこれを読むことができます: Understanding and Handling Connection Lifetime Events in SignalR

関連する問題