如何使用SignalR事件以正确的方式保持连接活动?

时间:2014-02-21 06:07:06

标签: c# asp.net signalr

我正在使用SignalR,ASP.NET和C#开发实时客户端 - 服务器应用程序。我使用localhost作为主机和VS2013。

我的问题是:

  1. 为什么我关闭服务器,在网络客户端发生“重新连接”事件?

  2. “断开连接”事件仅在 40+秒之后发生。如何缩短这段时间?

  3. 我需要客户端在启动时连接到服务器。 “重新连接”事件应仅在固定间隔内发生。如果“重新连接”间隔时间结束,则客户端应作为新客户端连接。如何归档这个目标?

  4. 最后,我想问一下 - 如何 SignalR 正确的方式 保持活力连接?

    我正在使用此代码:

    C#

    public override Task OnDisconnected()
    {
    clientList.RemoveAt(nIndex);
    Console.WriteLine("Disconnected {0}\n", Context.ConnectionId);
    return (base.OnDisconnected());
    }
    
    public override Task OnReconnected()
    {
    Console.WriteLine("Reconnected {0}\n", Context.ConnectionId);
    return (base.OnReconnected());
    }
    

    的Javascript

    $.connection.hub.reconnected(function () {
    // Html encode display name and message.
    var encodedName = $('<div />').text("heartbeat").html();
    var now = new Date();
    
    // Add the message to the page.
    $('#discussion').append('Reconnected to server: ' + now + '</br>');
    });
    
    $.connection.hub.disconnected(function () {
    // Html encode display name and message.
    var encodedName = $('<div />').text("heartbeat").html();
    var now = new Date();
    // Add the message to the page.
    $('#discussion').append('Disconnected from server: ' + now + '</br>');
    });
    

    连接后输出:

    message received from server : Fri Feb 21 2014 10:53:02
    

    关闭服务器输出后:

    Reconnected to server: Fri Feb 21 2014 10:53:22 <-- Why, if i close server ???
    Disconnected from server: Fri Feb 21 2014 10:53:53 <-- Why 40+ seconds after the server is closed ?
    

2 个答案:

答案 0 :(得分:29)

1。在我关闭服务器之后,在Web客户端上发生“重新连接”事件,并且仅在“断开连接”事件发生之后。为什么呢?

SignalR无法区分关闭服务器和重新启动服务器。因此,当服务器关闭时,客户端将开始尝试重新连接,以防服务器实际重新启动。

2。未知“重新连接”后,“断开连接”发生 30+秒。如何减少这段时间?

可以通过DisconnectTimeout property修改此30秒超时。

3。我需要客户端在启动时连接到服务器。 “重新连接”应仅在固定间隔内发生。如果“重新连接”间隔时间结束,则客户端应连接为新客户端。

您应该start the connection on the disconnected event,最好在超时后减少服务器负载,如果它重新启动。

$.connection.hub.disconnected(function() {
    setTimeout(function() {
        $.connection.hub.start();
    }, 5000); // Re-start connection after 5 seconds
});

整篇Understanding and Handling Connection Lifetime Events in SignalR文章可能与你的问题有关。

答案 1 :(得分:2)

此方法适用于不想更改服务器配置的情况; javascript示例代码:

connection.serverTimeoutInMilliseconds = 1000 * 60 * 10; // for  10 minute