Jak widać w Dokumentacji Microsoft o limitach czasu i ustawieniach aktywności , możesz zdefiniować DisconnectTimeout w opcjach.
Przykład:
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();
}
Edycja : Ponieważ chcesz zabić połączenie od klienta bez względu na wszystko, mówisz o CancellationToken
zachowaniu, ale niestety to nadal nie jest obsługiwane w SignalR, jak widać tutaj i tutaj , zespół chce to zrobić, SignalR
ale nadal jest brak wiadomości na ten temat.
Przeczytaj ten dokument firmy Microsoft dotyczący dożywotniego zdarzenia Hub. Możesz zmienić wartości domyślne tych ustawień, ustawić je
Application_Start
w swoimGlobal.asax
pliku. Ale w ten sposób nie możesz w pełni kontrolować strony klienta. Używasz więcsetTimeout
funkcji javascript i upływa czas od zakończenia serwera, kiedy nowy użytkownik connect.it może być wGlobalHost.Configuration.DisconnectTimeout
dowolnym momencie. Daję pełny przykład z projektem demo. Właściwie używam tej logiki w bardzo dużym systemie biletowym do posiadania biletu w czasie rzeczywistym. (proszę przeczytać cały komentarz wewnętrzny)Model:
Centrum:
TestView:
hub.js:
(Przetestowany)
źródło
Musisz zdefiniować limit czasu. Na serwerze możesz ustawić DisconnectTimeout w następujący sposób:
https://zzz.buzz/2016/05/11/setting-timeout-for-signalr-for-easier-debugging/
źródło
Zaktualizowana edycja, patrz Opcja 3 poniżej. Wszyscy inni polegają na przekroczeniu limitu czasu, opublikowałem wymuszone rozłączenie.
Jeśli próbujesz wymusić rozłączenie - możesz uzyskać listę połączonych użytkowników i wywołać
ForceLogOut
funkcję po stronie serwera, widziałem to gdzieś w projekcie kodu, mam nadzieję, że to pomoże. Jeśli chcesz tylko wymusić wylogowanie / zabić niektórych użytkowników, po prostu zapętl się i zabij tylko to połączenie.Po stronie serwera
Strona klienta
Zaktualizowano z Opcją 3 : na podstawie żądania ... inne rozwiązania polegają na przekroczeniu limitu czasu, ale można również wymusić to bezpośrednio , usuwając połączenie samodzielnie
Otworzyłem kod SignalR, aw środku widać
DisposeAndRemoveAsync
rzeczywiste zakończenie połączenia klienta.1- Możesz modyfikować lub dzwonić
DisposeAndRemoveAsync
przez swoje połączenie.2- Następnie zadzwoń
RemoveConnection(connection.ConnectionId);
Ostrożnie, zrób to sam po tym.
źródło
$.connection.hub.stop()
-Funkcja generuje błąd, ponieważ żądanie nie zostało w pełni wysłane do Backend. Dlatego szukam rozwiązania, które zabija aktualnie aktywne połączenie, nawet jeśli obecne jest aktywne żądanie.