Wie Sie in dieser Microsoft-Dokumentation zu Timeout- und Keepalive-Einstellungen sehen können, können Sie das DisconnectTimeout in den Optionen definieren.
Beispiel:
protected void Application_Start(object sender, EventArgs e)
{
// Make long-polling connections wait a maximum of 110 seconds for a
// response. When that time expires, trigger a timeout command and
// make the client reconnect.
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);
// Wait a maximum of 30 seconds after a transport connection is lost
// before raising the Disconnected event to terminate the SignalR connection.
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
// For transports other than long polling, send a keepalive packet every
// 10 seconds.
// This value must be no more than 1/3 of the DisconnectTimeout value.
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10);
RouteTable.Routes.MapHubs();
}
Bearbeiten : Da Sie die Verbindung vom Client CancellationToken
auf jeden Fall trennen möchten, sprechen Sie über ein Verhalten, aber leider wird dies in SignalR immer noch nicht unterstützt, wie Sie hier und hier sehen können. Das Team möchte dies tun, SignalR
aber es gibt es immer noch Keine Neuigkeiten darüber.
Bitte lesen Sie dieses Microsoft-Dokument über das Hub-Lebenszeitereignis. Sie können die Standardwerte für diese Einstellungen ändern und
Application_Start
in IhrerGlobal.asax
Datei festlegen . Auf diese Weise können Sie die Clientseite jedoch nicht vollständig steuern. Sie verwenden also die Javascript-setTimeout
Funktion und übergeben die Zeit vom Serverende, wenn ein neuer Benutzer eine Verbindung herstelltGlobalHost.Configuration.DisconnectTimeout
. Ich gebe ein vollständiges Beispiel mit Demo-Projekt. Eigentlich verwende ich diese Logik in einem sehr großen Ticketsystem für das Halten von Tickets in Echtzeit. (Bitte lesen Sie alle Inline-Kommentare)Modell:
Nabe:
TestView:
hub.js:
(Geprüft)
quelle
Sie müssen ein Timeout definieren. Auf dem Server können Sie DisconnectTimeout wie folgt festlegen:
https://zzz.buzz/2016/05/11/setting-timeout-for-signalr-for-easier-debugging/
quelle
Aktualisierte Bearbeitung, siehe Option 3 unten. Alle anderen verlassen sich auf Timeout, ich habe eine erzwungene Trennung gepostet.
Wenn Sie versuchen, eine Verbindung zu erzwingen, können Sie die Liste der verbundenen Benutzer abrufen und die
ForceLogOut
Funktion auf der Serverseite aufrufen. Ich habe dies irgendwo im Codeprojekt gesehen. Ich hoffe, es hilft. Wenn Sie nur einige der Benutzer erzwingen / beenden möchten, durchlaufen Sie einfach diese Verbindung und beenden Sie sie nur.Serverseite
Client-Seite
Aktualisiert mit Option 3 : basierend auf Anfrage ... die anderen Lösungen basieren auf einer Zeitüberschreitung, aber Sie können sie auch direkt erzwingen, indem Sie die Verbindung selbst trennen
Ich habe den SignalR-Code geöffnet und darin können Sie
DisposeAndRemoveAsync
die tatsächliche Beendigung einer Client-Verbindung sehen.1- Sie können
DisposeAndRemoveAsync
Ihre Verbindung ändern oder anrufen .2- Dann anrufen
RemoveConnection(connection.ConnectionId);
Achtung, räumen Sie selbst auf, wenn dies erledigt ist.
quelle
$.connection.hub.stop()
Funktion einen Fehler aus, da die Anforderung nicht vollständig an das Backend gesendet wurde. Daher suche ich nach einer Lösung, die die derzeit aktive Verbindung beendet, selbst wenn eine laufende Anforderung vorliegt.