【问题标题】:How to use SignalR events to keep connection alive in the right way?如何使用 SignalR 事件以正确的方式保持连接活动?
【发布时间】:2014-02-21 06:07:06
【问题描述】:

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

我的问题是:

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

  2. “断开连接”事件仅在 40 多秒 后发生。如何减少这个时间?

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

最后,我想问一下——如何以正确的方式使用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 ?

【问题讨论】:

    标签: c# asp.net signalr


    【解决方案1】:

    1。在我 close 服务器后,在 web 客户端上会发生“Reconnect”事件,而“Disconnect”事件仅在之后发生。为什么?

    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 文章可能与您的问题相关。

    【讨论】:

    • 但是在你处于Disconnect状态之后,你不会丢失所有在客户端订阅的事件吗?如何重新创建这些订阅(例如 .On&lt;T&gt;(...) 扩展)?
    • 只要您仍在使用原始 (Hub)Connection 对象,在重新启动断开的连接后订阅应该会继续工作。
    • @halter73 我认为您必须重新订阅您之前所在的组。
    • @ShyamalParikh 正确。如果您手动重新启动连接,您将需要重新订阅组。我只是指出,如果您使用 Connnection 反对,您不必再次通过 .On&lt;T&gt;(...) 配置回调。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,@SyeedMasoudTayefi。这是哪个连接对象?是$.connection 还是连接代理$.connection.myHub.connection
    猜你喜欢
    • 2021-06-01
    • 2020-07-10
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多