这是我的中心:
[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;
}
}
这是 SocketCommunicator 类的简化版本:
public class SocketCommunicator
{
private static SocketCommunicator _Instance = new SocketCommunicator();
public static SocketCommunicator Instance
{
get { 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()
{
// Do something and set this.MarketDataList
}
}
当我按 F5 并调试我的应用程序时,它就像一个魅力。当用户登录时,我的集线器中的 OnConnected 方法被调用,当用户注销时, OnDisconnected 方法被调用。但是,如果用户登录并关闭浏览器,则不会调用 OnDisconnected 方法。这意味着随着时间的推移,我的connectedUsers列表将包含大量未真正连接的UserDetail对象。我怎样才能避免这种情况呢?有没有更好的方法来存储用户连接 ID 关联?
提前致谢,
最佳答案
您等待 OnDisconnect 被调用需要多长时间?它并不总是即时的,特别是如果客户端没有“干净地”关闭(即关闭浏览器)。一旦连接超时,它最终应该被调用。
我有类似的设置并且运行良好。
关于asp.net - Signalr - 将用户名与 ConnectionId 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16561770/