SignalR用于跟踪在线用户和聊天

SignalR for tracking online users and chat

本文关键字:聊天 用户 在线 用于 跟踪 SignalR      更新时间:2023-09-26

我们正在开发一个社交网络应用程序,并将实现几个新功能。1.跟踪在线用户2.聊天(一对一聊天和稍后的群聊)

我已经研究过SingalR,它看起来很有希望。我们正在使用ASP.NET MVC 3,并且正在考虑使用集线器。我首先要问的问题是,SignalR是否比简单的聊天民意调查更好?就可伸缩性而言,什么会更好?我在SO上看到了其他问题,但就可伸缩性而言,我没能找出其中哪一个更好。

第二个问题是,如果我们使用SignalR,我们是否可以使用它来跟踪在线用户。我们可以每隔一段时间从每个客户端调用一个服务器端函数,说"我在线",在hub方法中,我们可以在DB中设置isOnline位。一旦客户端断开连接,我们就可以取消设置位。这行得通吗?还是简单的民意调查更好?如果我们使用简单的轮询,我们如何将用户设置为脱机?

我也在使用SignalR作为一种聊天架构。适用于我们的单一IIS服务器设置。对于可扩展性检查:Sclaing out SignalR

如果你使用Hubs,你可以通过查询像这样的连接客户端来解决"我在线"的问题

var clients = Hub.GetClients<Type of your hub here>();

并向每个客户端请求UserID。如果丢失了任何连接,您必须找到数据库中的在线用户,这些用户不再是集线器的客户端。

另一种方法是将用户设置为在线,作为从用户到集线器的第一条消息。"嗨,我在那里"。并使用此解决方案

public class MyHub : Hub, IDisconnect
{
    public Task Disconnect()
    {
        // Query the database to find the user by it's client id.
        var user = db.Users.Where(u => u.ConnectionId == Context.ConnectionId);
        return Clients.disconnected(user.Name);
    }
}

处理断开连接事件。

希望我能给你一些想法。

SignalR比轮询更好,因为数据库连接涉及网络流量。此外,考虑一下您将在MVC项目中使用哪个版本的signalR,因为signalR的最新版本仅支持.net 4.5。

至于连接的数量,这取决于您有多少内存以及您在IIS中配置了多少连接。你可以在一台像样的钻机上轻松处理1000+。

与Tom的回答一样,您可以将事件拦截到集线器或较低的signalR接口,以获取计数、断开连接和连接事件。