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

时间:2012-03-11 11:41:19

标签: javascript asp.net-mvc-3 signalr

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

我调查了SingalR,看起来很有希望。我们正在使用ASP.NET MVC 3并且正在考虑使用集线器。 我的问题是,SignalR是否更好而不是简单的聊天轮询?就可扩展性而言,什么会更好?我已经看到了关于SO的其他问题,但就可扩展性而言,无法找出哪一个更好。

第二个问题是,如果我们使用SignalR,我们是否可以使用它来跟踪在线用户。我们可以定期从每个客户端调用服务器端函数来说“我在线”,在hub方法中我们可以在DB中设置isOnline位。一旦客户端断开连接,我们可以取消设置。这项工作或简单的民意调查会更好吗?如果我们使用简单轮询,我们如何将用户设置为离线?

2 个答案:

答案 0 :(得分:5)

我也使用SignalR作为一种聊天架构。完美地运行我们的单个IIS服务器设置。 有关可伸缩性的信息,请查看:Sclaing-out-SignalR

如果您正在使用集线器,您可以通过查询连接的客户端来解决“我在线”问题,例如this

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

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

另一种方法是将用户设置为在线,作为从用户到集线器的第一条消息。 “嗨,我在那里”。 并使用this solution

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);
    }
}

处理断开事件。

希望我能给你一些想法。

答案 1 :(得分:1)

SignalR优于轮询,因为数据库连接涉及网络流量。另外,请考虑您将使用MVC项目使用的signalR版本,因为signalR的最新版本仅支持.net 4.5。

对于连接数,它取决于您拥有多少内存以及您在IIS中配置了多少连接。你可以在一个不错的装备上轻松处理1000+。

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