我目前正在使用SignalR(2.1)Hubs开发应用程序。
我有一个WPF客户端,另一个是WCF客户端。 一切正常,因为他们完美地传递了信息。
我现在面临的唯一问题是我注意到当应用程序因自动重启,WCF服务器关闭以及其他一些原因而关闭时,OnDisconnected根本没有被触发。超时是默认值30秒。即使过了1天,我也从未打过电话(我试过)。但是,超时适用于Web客户端。
它只在我调用hub.connection.stop()时才有效。
当客户端是浏览器时,Ondisconnected方法非常有效。
因此,我想问一下Signal R Hub是否有办法检查客户端是否仍然连接或是否已经退出(例如ping)?
答案 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方法中,尝试通过再次调用上面的代码来重新连接。