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

时间:2014-07-22 03:00:13

标签: c# signalr

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

我有一个WPF客户端,另一个是WCF客户端。 一切正常,因为他们完美地传递了信息。

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

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

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

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

2 个答案:

答案 0 :(得分:23)

在SignalR 2.1.0中,有一个new overload to OnDisconnected带有一个bool,指示客户端是否正常断开连接。这种变化背后的原因在"突破性变化" 2.1.0 release notes

的部分

您的新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);
}

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

在2.1.0之前,对于优雅的非正常断开连接,都调用了(仅)OnDisconnected方法,该方法没有参数。由于此行为更改导致several reported issues,旧的OnDisconnected重载is being removed in SignalR's upcoming 2.1.1 release

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

答案 1 :(得分:0)

如果我强制服务器关闭连接,我发现我的客户端不会重新连接。 (我得到WSSockets错误)

所以,对我来说,修复是:

con = new HubConnection(_url);
con.Error += (exception) => Error(exception);
con.Start();

然后,在Error方法中,尝试通过再次调用上面的代码来重新连接。