ユーザーへの接続のマッピングは、目的に応じて複数の方法で実行できます。
メモリー内ストレージ:
これを行う最善の方法は、並行辞書を使用することです。これにより、スレッドセーフな操作が可能になりますが、あなたが言ったように、膨大な数の接続に対する最適なソリューションではありません。
永続的な外部ストレージ
マッピングをデータベースに保持します。
良い点:マッピングは複数の Web サーバーで利用可能です
悪い点:データベースに多くのストレスがかかり、多くのクリーンアップが必要です
シングル ユーザー グループ ユーザー
ごとに 1 つのグループを作成します。これは最もシンプルで実用的なソリューションです。
良い点:
~ 使用と実装が非常に簡単
~ SignalR は、切断時にグループから接続を削除するほどスマートです ~
最後の接続を削除すると、グループは削除されます
~ Identity を使用する場合、一意のグループ名を[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;
}
}
}
(それほどではない)悪い点:どのユーザーがどのグループに参加するかに注意する必要があります。!しない!クライアント側でグループ参加機能を実装します。代わりに、OnConnected と OnReconnected を使用して接続をグループに追加します。
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);
}
他の質問については、これを読むことができます:
SignalR での接続有効期間イベントの理解と処理