asp.net - Signalr - Associating usernames with connectionIds -
here hub:
[hubname("marketwatch")] public class marketwatchhub : hub { public override task onconnected() { socketcommunicator.instance.userconnected(context.connectionid, context.user.identity.name); return base.onconnected(); } public override task ondisconnected() { socketcommunicator.instance.userdisconnected(context.connectionid); return base.ondisconnected(); } public override task onreconnected() { // todo: implement... return base.onreconnected(); } public list<marketdataresponse> getallmarketwatchdata() { return socketcommunicator.instance.marketdatalist; } } and here simplified version of socketcommunicator class:
public class socketcommunicator { private static socketcommunicator _instance = new socketcommunicator(); public static socketcommunicator instance { { return socketcommunicator._instance; } } private socket socket { get; set; } private readonly object lockobj = new object(); private ihubcontext hubcontext; private list<userdetail> connectedusers; public list<marketdataresponse> marketdatalist; private socketcommunicator() { } public void userconnected(string connectionid, string username) { lock (lockobj) { connectedusers.add(new userdetail() { connectionid = connectionid, username = username }); } } public void userdisconnected(string connectionid) { lock (lockobj) { connectedusers.removeall(ud => ud.connectionid == connectionid); } } public void getmarketdata() { // , set this.marketdatalist } } when hit f5 , debug application works charm. when user logs in, onconnected method in hub called , when user logs off ondisconnected method called. if user logs in , close his/her browser, ondisconnected method not being called. means in time, connectedusers list contain enormous number of userdetail objects not connected. how can avoid situation? there better way store user - connection id association?
thanks in advance,
how long waiting ondisconnect called? isn't instantaneous, if client doesn't close 'cleanly' (i.e. closing browser). should called eventually, once connection times-out.
i have similar setup , works fine.
Comments
Post a Comment