SignalR:在C#客户端中检测活动连接

Kio*_*ong 13 c# signalr

我目前正在使用SignalR(2.1)Hubs开发一个应用程序.

我有一个WPF客户端,另一个是WCF客户端.一切都很好,因为他们完美地传递了信息.

我现在遇到的唯一问题是我注意到当应用程序因自动重启,WCF服务器故障以及其他一些原因而关闭时,OnDisconnected根本没有被触发.超时是默认值30秒.即使过了1天,我也从未打过电话(我试过).但是,超时适用于Web客户端.

它只在我调用hub.connection.stop()时才有效.

然而,当客户端是浏览器时,Ondisconnected方法非常有效.

因此,我想问一下Signal R Hub是否有办法检查客户端是否仍然连接或已经退出(例如ping)?

hal*_*r73 23

在SignalR 2.1.0中,OnDisconnected有一个新的重载,它接受一个bool来指示客户端是否正常断开连接.这一变化背后的原因在2.1.0发行说明的"重大更改"部分进行了解释.

您的新OnDisconnected方法可能如下所示:

public override Task OnDisconnected(bool stopCalled)
{
    if (stopCalled)
    {
        // We know that Stop() was called on the client,
        // and the connection shut down gracefully.
    }
    else
    {
        // This server hasn't heard from the client in the last ~35 seconds.
        // If SignalR is behind a load balancer with scaleout configured, 
        // the client may still be connected to another SignalR server.
    }

    return base.OnDisconnected(stopCalled);
}
Run Code Online (Sandbox Code Playgroud)

不使用bool的旧OnDisconnected方法不会因非正常断开连接而被调用,因此如果您正在使用该事件,则可以解释您所看到的问题.

在2.1.0之前,对于正常非正常断开连接,都调用了(仅)OnDisconnected方法,该方法没有参数.由于此行为更改已导致多个报告问题,因此在SignalR即将发布的2.1.1版本中将删除旧的OnDisconnected重载.

这将导致使用SignalR的旧OnDisconnected方法的应用程序在针对SignalR 2.1.1构建时无法编译.虽然这并不理想,但它有望让开发人员意识到这一重大变化,因此他们有机会在部署之前适当地修改他们的应用程序.