SignalR - 立即检测断开连接的客户端

时间:2015-08-05 10:49:00

标签: asp.net-mvc signalr signalr.client

我正在开发一个应用程序,需要识别某人何时从系统中退出 我将ping间隔设置为5秒。我还有public override Task OnConnected()public override Task OnDisconnected(),每次客户端连接和断开连接时都会触发它们(我记得连接时客户端名称和连接,并在断开连接时从列表中删除这些数据)

因此,当客户端登录系统时,他的连接丢失,并且他没有发送任何ping响应。我有这个解决方案工作,但是当它需要太多时间,大约30秒运行OnDisconnected功能。 有没有可能让这个过程更快?我必须至少在4-5秒内检测到这一点。

编辑:这是代码 的 Hub.cs:

public class SignalRConnection
    {
        public string ConnectionId { get; set; }
        public string UserName { get; set; }
    }
public static List<SignalRConnection> connections = new List<SignalRConnection>();
public override Task OnConnected()
        {            
            connections.Add(new SignalRConnection() { ConnectionId = Context.ConnectionId, UserName=Context.User.Identity.Name});
            return base.OnConnected();
        }

        public override Task OnDisconnected()
        {
            var forDelete = connections.FirstOrDefault(p => p.ConnectionId == Context.ConnectionId);
            connections.Remove(forDelete);           
            Clients.All.logoffActions(forDelete.UserName);
            return base.OnDisconnected();
        }

Global.asax中

GlobalHost.Configuration.ConnectionTimeout =TimeSpan.FromSeconds(6);            
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(6);
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(2);

1 个答案:

答案 0 :(得分:0)

您可以检测javascript发生的情况。这有助于了解连接发生的情况:http://www.asp.net/signalr/overview/guide-to-the-api/handling-connection-lifetime-events

首先,您的连接进入reconnecting状态(连接速度慢,连接中断时间短......)在此状态下尝试再次连接。默认情况下,每5秒钟进行6次,这需要30秒。如果没有成功,则会触发disconnected事件,该事件将调用您的集线器的OnDisconnected方法。

您可以在javascript中使用重新连接功能,但在此状态下,客户端仍然可以返回。

你可以使用像JS这样的东西:

var tryingToReconnect = false;

$.connection.hub.reconnecting(function() {
    tryingToReconnect = true;
});

$.connection.hub.reconnected(function() {
    tryingToReconnect = false;
});

$.connection.hub.disconnected(function() {
    if(tryingToReconnect) {
        notifyUserOfDisconnect(); // Your function to notify user.
    }
});

当连接断开时,$.connection.hub.reconnecting(function() {将立即被调用(但此事件的触发并不总是意味着连接已关闭!这可能只是一个快速连接问题)

另一个有用的事情是connectionSlow事件。

$.connection.hub.connectionSlow(function() {
    notifyUserOfConnectionProblem(); // Your function to notify user.
});

最重要的是要了解链接描述中描述的状态和转换。

我希望它有所帮助。干杯!