SignalR .Net客户端:如何重新建立连接

时间:2013-07-03 01:40:19

标签: client signalr

我已阅读this post

  

在某些应用程序中,您可能希望在连接丢失并重新连接尝试超时后自动重新建立连接。为此,您可以从Closed事件处理程序(JavaScript客户端上的已断开事件处理程序)调用Start方法。您可能希望在调用Start之前等待一段时间,以避免在服务器或物理连接不可用时过于频繁地执行此操作。以下代码示例适用于使用生成的代理的JavaScript客户端。

当我从Closed事件中调用Start方法时

connection.Closed += connection_Closed;
static void connection_Closed()
    {
        Console.WriteLine("connection closed");
        ServerConnection.Start().Wait();
    }

发生异常:     连接尚未建立。

我希望它能继续,直到服务器运行正常。不要抛出异常。我怎么做到这一点。

任何想法?

感谢

3 个答案:

答案 0 :(得分:10)

<。>在.net客户端上,您可以从已关闭的事件处理程序中调用start方法。 如果服务器不可用,则应进行递归调用。

e.g。

_connection.Closed += OnDisconnected;
static void OnDisconnected()
{
    Console.WriteLine("connection closed");
    var t=_connection.Start()

    bool result =false;
    t.ContinueWith(task=>
    {
       if(!task.IsFaulted)
       {
           result = true;
       }
    }).Wait();

    if(!result)
    {
         OnDisconnected();
    }
}

答案 1 :(得分:7)

凤凰答案的不同之处:

  • 由于OnDisconnected事件在连接失败时被触发,因此实际上不需要显式调用Closed
  • 重试前的小延迟
  • 每次重新创建ConnectionHub - 在我的经验中似乎是必要的(旧的应该由GC处理)

代码:

private HubConnection _hubConnection = null;
private IHubProxy _chatHubProxy = null;

private void InitializeConnection()
{
    if (_hubConnection != null)
    {
        // Clean up previous connection
        _hubConnection.Closed -= OnDisconnected;
    }

    _hubConnection = new HubConnection("your-url");
    _hubConnection.Closed += OnDisconnected;
    _chatHubProxy = _hubConnection.CreateHubProxy("YourHub");

    ConnectWithRetry();
}

void OnDisconnected()
{
    // Small delay before retrying connection
    Thread.Sleep(5000);

    // Need to recreate connection
    InitializeConnection();
}

private void ConnectWithRetry()
{
    // If this fails, the 'Closed' event (OnDisconnected) is fired
    var t = _hubConnection.Start();

    t.ContinueWith(task =>
    {
        if (!task.IsFaulted)
        {
            // Connected => re-subscribe to groups etc.
            ...
        }
    }).Wait();
}

答案 2 :(得分:6)

我刚刚在http://www.asp.net/signalr/overview/signalr-20/hubs-api/handling-connection-lifetime-events

找到答案

“如何连续重新连接

在某些应用程序中,您可能希望在连接丢失并重新连接尝试超时后自动重新建立连接。为此,您可以从Closed事件处理程序(JavaScript客户端上的已断开事件处理程序)调用Start方法。您可能希望在调用Start之前等待一段时间,以避免在服务器或物理连接不可用时过于频繁地执行此操作。以下代码示例适用于使用生成的代理的JavaScript客户端。

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

移动客户端需要注意的一个潜在问题是,当服务器或物理连接不可用时,连续重新连接会导致不必要的电池耗尽。“