2013-07-03 17 views
11

I this postSignalR .Net-Client: Wie eine Verbindung wieder herzustellen

In einigen Anwendungen gelesen haben Sie automatisch eine Verbindung wollen vielleicht wieder herzustellen, nachdem es verloren gegangen ist und den Versuch zu verbinden hat timed aus. Um dies zu tun, können Sie die Start-Methode von Ihrem Closed-Event-Handler (getrennter Event-Handler für JavaScript-Clients) aufrufen. Möglicherweise möchten Sie vor dem Aufruf von Start eine gewisse Zeit warten, um dies zu vermeiden, wenn der Server oder die physische Verbindung nicht verfügbar sind. Das folgende Codebeispiel ist für einen JavaScript-Client, der den generierten Proxy verwendet.

Wenn ich die Start-Methode aus dem Closed-Ereignisse

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

Ausnahme passiert: die Verbindung hergestellt worden ist.

Ich will es weiter bis es Erfolg, wenn der Server in Ordnung ist. Keine Ausnahme auslösen. Wie erreiche ich das?

irgendwelche Ideen?

dank

Antwort

8

auf .net-Client können Sie Aufruf der Methode von geschlossener Ereignisbehandlungsroutine starten. wenn der Server nicht verfügbar ist, sollten Sie einen rekursiven Anruf.

zB

_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(); 
    } 
} 
6

Ich habe gerade eine Antwort auf http://www.asp.net/signalr/overview/signalr-20/hubs-api/handling-connection-lifetime-events

„Wie kontinuierlich

In einigen Anwendungen verbinden Sie automatisch eine Verbindung wollen vielleicht wieder herzustellen, nachdem es verloren gegangen ist und Bei dem Versuch, die Verbindung wiederherzustellen, ist das Zeitlimit abgelaufen. Dazu können Sie die Methode Start von Ihrem Closed-Ereignishandler (getrennter Ereignishandler für JavaScript-Clients) aufrufen. Möglicherweise möchten Sie vor dem Aufruf von Start einige Zeit warten, um dies zu vermeiden zu häufig, wenn der Server oder die physische Verbindung sind nicht verfügbar. Das folgende Codebeispiel ist für einen JavaScript-Client, der den generierten Proxy verwendet.

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

Ein mögliches Problem bei mobilen Kunden bewusst zu sein, ist, dass kontinuierliche Versuche Wiederverbindung, wenn der Server oder physikalische Verbindung nicht verfügbar ist unnötige Batterieentladung führen könnte.“

+0

Ich habe diesen Beitrag gelesen; Ich denke, ich sollte den Wert einer Variablen auf false setzen, wenn das geschlossene Ereignis ausgelöst wird.Wenn die Variable wahr ist, kann ich die "Invoke" -Methode verwenden. – phoenix

+0

Sie können den Status der Verbindung anstelle der globalen Variablen – Nestor

+0

verwenden, wenn dies nicht die "setInterval" -Methode von Javascript verwendet? Andernfalls wird die erneute Verbindung nur einmal versucht. – willem

4

Unterschiede zu phoenix Antwort:

  • kein expliziter Aufruf OnDisconnected tatsächlich da das Closed Ereignis erforderlich ist, auf Verbindungsfehler ausgelöst wird
  • Kleine Verzögerung vor
  • Recreate ConnectionHub jedes Mal wiederholen - scheinen in meiner Erfahrung notwendig (alt sollte man durch GC)

-Code entsorgt erhalten:

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(); 
} 
+0

Eine kurze Frage. Warum haben wir 'ConnectWithRetry()' eine separate Funktion? Können wir es einfach in 'InitializeConnection()' selbst einfügen? Oder übersehe ich etwas sehr Offensichtliches? – skjoshi

+1

Nur Lesbarkeit, denke ich (http://programmers.stackexchange.com/q/195989) – Dunc

Verwandte Themen