我正在使用SignalR的.NET Web应用程序,其中心类类似于以下示例类:
public class ContosoChatHub : Hub
{
public override Task OnConnected()
{
// Add your own code here.
// For example: in a chat application, record the association between
// the current connection ID and user name, and mark the user as online.
// After the code in this method completes, the client is informed that
// the connection is established; for example, in a JavaScript client,
// the start().done callback is executed.
return base.OnConnected();
}
public override Task OnDisconnected()
{
// Add your own code here.
// For example: in a chat application, mark the user as offline,
// delete the association between the current connection id and user name.
return base.OnDisconnected();
}
public override Task OnReconnected()
{
// Add your own code here.
// For example: in a chat application, you might have marked the
// user as offline after a period of inactivity; in that case
// mark the user as online again.
return base.OnReconnected();
}
}
更具体地说,我的网络应用程序充当连接平板电脑的枢纽。当我关闭平板电脑上的应用程序时,它不会立即触发OnDisconnected任务,最多需要20秒或更长时间(服务器尝试与客户端重新连接)。
我的问题是,我应该使用哪种方法来立即检测到连接丢失,或者是否有一个连接状态处理程序在连接丢失时触发?
为了防止数据丢失(实际上不是在线考虑平板电脑),我真的需要处理断开连接事件。
非常感谢您的帮助!
以后编辑: 我还在Global.asax文件中添加了以下几行
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(6);
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(2);
在“应用程序启动”方法中。如调试中所见,这些值似乎已保存,实际上将时间减少了一半,从20-30秒减少到12-14秒,但仍然不及2-3秒。
答案 0 :(得分:0)
您可以检测到与SignalR客户端的服务器断开连接:
$.connection.hub.disconnected(function () {
alert('Server has disconnected');
});
这是每个方法调用时的官方文档:
调用OnConnected,OnDisconnected和OnReconnected
每次浏览器导航到新页面时,新连接都必须 建立,这意味着SignalR将执行OnDisconnected 方法,然后是OnConnected方法。 SignalR始终会创建一个 建立新连接后,新的连接ID。
在出现临时情况时调用OnReconnected方法 SignalR可以自动恢复的连接中断, 例如当电缆暂时断开并重新连接时 在连接超时之前。调用OnDisconnected方法 当客户端断开连接并且SignalR无法自动进行时 重新连接,例如当浏览器导航到新页面时。因此, 给定客户端的可能事件序列为OnConnected, OnReconnected,OnDisconnected;或OnConnected,OnDisconnected。您 不会看到序列OnConnected,OnDisconnected,OnReconnected 给定的连接。
在某些情况下,不会调用OnDisconnected方法 当服务器出现故障或App Domain被回收时。什么时候 另一台服务器上线或App Domain完成回收, 一些客户端可能能够重新连接并触发OnReconnected 事件。