繁体   English   中英

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

[英]SignalR: Detecting Alive Connection in C# clients

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM