当连接断开或有连接状态更改处理程序时,会调用什么SignalR方法?

时间:2018-07-15 11:46:08

标签: c# asp.net websocket signalr

我正在使用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秒。

1 个答案:

答案 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   事件。