クライアントサイドと呼ばれるメソッドを持つハブがあります。このメソッドは、10秒ごとに実行されるデリゲートを使用してタイマーを起動します。ハブに誰も接続されていない場合、このデリゲートを実行し続けることは意味がないため、スケジュールを変更する前に、デリゲート内からまだユーザーが接続されているかどうかを確認したいと思います。これを行う方法はありますか?
おそらく最もよく使用される解決策は、現在接続しているユーザーを含む静的変数を保持し、使用するバージョンに応じてOnConnect
とOnDisconnect
をオーバーライドするか、IDisconnect
を実装することです。
次のようなものを実装します。
public class MyHub : Hub
{
private static List<string> users = new List<string>();
public override Task OnConnected()
{
users.Add(Context.ConnectionId);
return base.OnConnected();
}
//SignalR Verions 1 Signature
public override Task OnDisconnected()
{
users.Remove(Context.ConnectionId);
return base.OnDisconnected();
}
//SignalR Version 2 Signature
public override Task OnDisconnected(bool stopCalled)
{
users.Remove(Context.ConnectionId);
return base.OnDisconnected(stopCalled);
}
// In your delegate check the count of users in your list.
}
ConnectionIdをデータベースに保存すると、次のことを確認できます。
var heartBeat = GlobalHost.DependencyResolver.Resolve<ITransportHeartbeat>();
var connectionAlive = heartBeat.GetConnections().FirstOrDefault(c=>c.ConnectionId == connection.ConnectionId);
if (connectionAlive.IsAlive)
{
//Do whatever...
}
私はこのようにしました:
public class PrincipalCommunicator
{
public readonly static Lazy<PrincipalCommunicator> _instance = new Lazy<PrincipalCommunicator>(
() => new PrincipalCommunicator(GlobalHost.ConnectionManager.GetHubContext<PrincipalHub>())
);
public List<string> ConnectedUsers { get; set; }
private IHubContext _context;
private PrincipalCommunicator(IHubContext context)
{
ConnectedUsers = new List<string>();
_context = context;
}
public static PrincipalCommunicatorInstance
{
get
{
return _instance.Value;
}
}
public bool IsUserConnected(string user)
{
return UsuariosConectados.Contains(user);
}
}
public class PrincipalHub : Hub
{
public override Task OnConnected()
{
PrincipalComunicador.Instance.UsuariosConectados.Add(Context.User.Identity.Name);
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
PrincipalComunicador.Instance.UsuariosConectados.Remove(Context.User.Identity.Name);
return base.OnDisconnected(stopCalled);
}
}
}
このように、クライアントに何かを送信するためのすべてのロジックは1つの場所にとどまり、 例のように そしてユーザーがコード内のどこかに接続されているかどうかを知ることができます。
差出人 http://forums.asp.net/t/1829432.aspx/1?How+do+I+get+list+of+connected+clients+on+signalr+
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.notify("Hello world");
したがって、context.Clients.Countを取得できるはずです。
その投稿は wiki も参照しています。これにはたくさんの良い情報があります。 OnConnected/OnDisconnectedの例を使用してユーザーを追跡し、ユーザーがゼロになったら通話を停止することができます。