2012-12-03 15 views
8

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

答えて

16

おそらく最もよく使用される解決策は、現在接続されているユーザーを含む静的変数を保持し、使用するバージョンによってOnConnectOnDisconnectまたは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) 
    { 
     return base.OnDisconnected(stopCalled); 
    } 

    // In your delegate check the count of users in your list. 
} 
+0

これは他の場所で言及されているのを見ましたが、もっと良い方法があることを望んでいました。ありがとう、私はそれを試してみよう! – edobry

+2

複数のスレッドが単一のリソースにアクセスしようとする同時性に問題はありますか? –

+3

ハブの寿命モデルであるため、これをバックプレーンでスケーリングする可能性がなくなるため、これは確実に機能しないだけでなく、唯一の本当の答えは、redisやappfabricのような共有キャッシュ内のオンラインステータスを追跡することです。 – Bon

1

IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
context.Clients.notify("Hello world"); 

http://forums.asp.net/t/1829432.aspx/1?How+do+I+get+list+of+connected+clients+on+signalr+からだから、context.Clients.Countを得ることができる必要があります。

この投稿はまた、多くの良い情報を持っているwikiを参照しています。 OnConnected/OnDisconnectedの例を使用してユーザーを追跡し、ユーザーがゼロになると呼び出しを停止することができます。

+0

おかげで、私はやろうとしていますこれはハブの中から...それはまだ動作しますか? – edobry

10

あなたのデータベースにあなたのconnectionIdを保存する場合は、あなたがこれを確認することができます。提案のための

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

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

if (connectionAlive.IsAlive) 
{ 
//Do whatever... 
} 
+1

'Microsoft.AspNet.SignalR.Transports'を使用して追加する必要があります –

+0

また、.Transportsはコアアセンブリ内にありません...バマー!参照:https://msdn.microsoft.com/en-us/library/microsoft.aspnet.signalr.transports.transportmanager%28v=vs.118%29.aspx?f=255&MSPPError=-2147217396 –

関連する問題