17

クライアント側と呼ばれるメソッドを持つハブがあります。このメソッドは、10 秒ごとに実行されるデリゲートでタイマーを起動します。誰もハブに接続していない場合、このデリゲートを実行し続けるのは意味がないため、スケジュールを変更する前に、デリゲート内からまだ接続しているユーザーがいるかどうかを確認したいと思います。これを行う方法はありますか?

4

4 に答える 4

18

おそらく最もよく使用される解決策は、使用しているバージョンに応じて、現在接続され、オーバーライドまたは実装されているユーザーを含む静的変数を保持することOnConnectですOnDisconnectIDisconnect

次のようなものを実装します。

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.
}
于 2012-12-03T21:37:04.533 に答える
17

データベースに connectionId を保存すると、次のことを確認できます。

var heartBeat = GlobalHost.DependencyResolver.Resolve<ITransportHeartbeat>();

var connectionAlive = heartBeat.GetConnections().FirstOrDefault(c=>c.ConnectionId == connection.ConnectionId);

if (connectionAlive.IsAlive)
{
//Do whatever...
}
于 2015-11-18T12:28:43.550 に答える
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を取得できるはずです。

その投稿はまた、たくさんの良い情報を持っているウィキを参照しています。OnConnected / OnDisconnectedの例を使用してユーザーを追跡し、ユーザーがゼロになったら通話を停止してみてください。

于 2012-12-03T21:36:29.357 に答える