检测SignalR用户断开连接

8

我需要使用 SignalR 检测用户连接和断开。

我有下面这两个 Hub 方法:

public void Say(string message)
{
    Trace.WriteLine(message + " - " + Context.ConnectionId);
}

public void Goodbye(string message)
{
    Trace.WriteLine(message + " - " + Context.ConnectionId);
}

我已经实现了Say方法,它会检测连接的状态,代码如下:

$.connection.hub
            .start()
            .done(function () {
                hub.server.say("Hello SignalR");
});

但是我如何检测到断开连接?


1
在客户端上,可以使用$.connection.hub.disconnected(function () { …或者在hub中重写OnDisconnected(bool stopCalled) { - stuartd
@stuartd 我似乎无法在回调中调用hub方法,$.connection.hub.disconnected(function () { hub.server.goodbye("bye"); }); 无法工作。 - frc
1
无法工作,因为客户端已断开连接。 - stuartd
实际上,您不需要在客户端显式调用任何方法(因为此时已经断开连接)。在服务器端,SignalR框架会默认调用OnDisconnected方法。 - Jaroslav Kadlec
1
更好,谢谢大家! - frc
2个回答

4
将此覆盖方法添加到您的Hub类中:
public override Task OnDisconnected(bool stopCalled)
{
    // do the logging here
    Trace.WriteLine(Context.ConnectionId + ' - disconnected');
    return base.OnDisconnected(stopCalled);
}

这将处理并记录服务器端的断开连接,尽管我认为在客户端跟踪它并没有太多意义,因为不太可能从服务器端终止您的SignalR会话-请参见此处
根据@stuartd的评论进行编辑: 您还可以进行覆盖。
public override Task OnReconnected()
{
    Trace.WriteLine(Context.ConnectionId + ' - reconnected');
    return base.OnReconnected();
}

所以你将能够追踪客户端尝试重新连接服务器并成功的情况。

编辑#2: 然后,您当然可以使用相同的机制来跟踪OnConnected事件。

public override Task OnConnected()
{
    Trace.WriteLine(Context.ConnectionId + ' - reconnected');
    return base.OnConnected();
}

因此,所有跟踪代码都方便地保留在服务器端,这在客户端已登录到中心但由于某种原因未能执行用于跟踪已登录状态的方法时更加稳健。


确实,但我认为这没有什么区别。当调用此方法时,服务器端已经将客户端视为断开连接,如果它能够从客户端重新连接成功,则应调用Hub类的public override Task OnReconnected(),以便可以记录日志,或者我漏掉了什么? - Jaroslav Kadlec
一个很好的资源是这个页面:https://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server,其中包括“如何在Hub类中处理连接生命周期事件”及其子部分。 - Jaroslav Kadlec
2
AspNetCore.SignalR 中,我需要使用 public override Task OnDisconnectedAsync(Exception? e) - Qwertie

1

在AspNetCore.SignalR中

public override async Task OnDisconnectedAsync(Exception? exception)
        {
            Trace.WriteLine(Context.ConnectionId + ' - disconnected');
            await base.OnDisconnectedAsync(exception);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接