asp.net - Signalr - 将用户名与 ConnectionId 关联

标签 asp.net asp.net-mvc multithreading signalr signalr-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;
    }
}

这是 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/

相关文章:

python - 批处理迭代如何在 Tensorflow 中工作?

python - 如何使用 PRAW (Reddit) 和多线程更新数据帧

c++ - 奇怪的线程堆栈

c# - PayPal 与我的网站集成(我已经阅读过现有帖子)

c# - ASP.net 从 URL 加载 XML 文件

c# - 将数据集 (.net) 中的列加载到字符串 [] 中的最佳方法是什么?

c# - 使用自定义表扩展 asp.net mvc 5 身份

c# - 客户端消息功能

asp.net - 如何为 ASP Razor MVC 设置默认布局

c# - System.Data.SqlClient.SqlException : 'Invalid column name ' ApplicationRoleId'. '