Opis i obsługa zdarzeń okresu istnienia połączenia w usłudze SignalR 1.x
Autor: Patrick Fletcher, Tom Dykstra
Ostrzeżenie
Ta dokumentacja nie dotyczy najnowszej wersji usługi SignalR. Przyjrzyj się ASP.NET Core SignalR.
Ten artykuł zawiera omówienie zdarzeń połączenia usługi SignalR, ponownego nawiązywania połączenia i rozłączania, które można obsługiwać, oraz przekroczenia limitu czasu i ustawień utrzymania aktywności, które można skonfigurować.
W tym artykule założono, że masz już pewną wiedzę na temat usługi SignalR i zdarzeń okresu istnienia połączenia. Aby zapoznać się z wprowadzeniem do usługi SignalR, zobacz SignalR — omówienie — Wprowadzenie. Aby uzyskać listę zdarzeń okresu istnienia połączenia, zobacz następujące zasoby:
Omówienie
Ten artykuł zawiera następujące sekcje:
Linki do tematów referencyjnych interfejsu API to wersja interfejsu API platformy .NET 4.5. Jeśli używasz platformy .NET 4, zobacz tematy dotyczące platformy .NET 4 interfejsu API.
Terminologia i scenariusze dotyczące okresu istnienia połączenia
Program OnReconnected
obsługi zdarzeń w usłudze SignalR Hub może być wykonywany bezpośrednio po OnConnected
, ale nie po OnDisconnected
dla danego klienta. Przyczyną ponownego połączenia bez rozłączenia jest to, że istnieje kilka sposobów, w których słowo "połączenie" jest używane w usłudze SignalR.
Połączenia SignalR, połączenia transportowe i połączenia fizyczne
Ten artykuł rozróżnia połączenia usługi SignalR, połączenia transportowe i połączenia fizyczne:
- Połączenie usługi SignalR odnosi się do relacji logicznej między klientem a adresem URL serwera obsługiwanym przez interfejs API usługi SignalR i jednoznacznie identyfikowanym przez identyfikator połączenia. Dane dotyczące tej relacji są obsługiwane przez usługę SignalR i służą do nawiązywania połączenia transportowego. Relacja kończy się, a usługa SignalR usuwa dane, gdy klient wywołuje
Stop
metodę lub osiągnięto limit czasu, gdy usługa SignalR próbuje ponownie ustanowić utracone połączenie transportowe. - Połączenie transportu odnosi się do relacji logicznej między klientem a serwerem obsługiwanym przez jeden z czterech interfejsów API transportu: WebSockets, zdarzenia wysyłane przez serwer, na zawsze ramkę lub długie sondowanie. Usługa SignalR używa interfejsu API transportu do utworzenia połączenia transportowego, a interfejs API transportu zależy od istnienia fizycznego połączenia sieciowego w celu utworzenia połączenia transportowego. Połączenie transportowe kończy się, gdy usługa SignalR zakończy połączenie lub gdy interfejs API transportu wykryje, że połączenie fizyczne zostanie przerwane.
- Połączenie fizyczne odnosi się do fizycznych łączy sieciowych — przewodów, sygnałów bezprzewodowych, routerów itp. — ułatwiający komunikację między komputerem klienckim a komputerem serwera. Połączenie fizyczne musi być obecne w celu ustanowienia połączenia transportowego, a połączenie transportowe musi zostać ustanowione w celu nawiązania połączenia usługi SignalR. Jednak przerwanie połączenia fizycznego nie zawsze powoduje natychmiastowe zakończenie połączenia transportowego ani połączenia signalR, jak wyjaśniono w dalszej części tego tematu.
Na poniższym diagramie połączenie usługi SignalR jest reprezentowane przez warstwę Interfejs API koncentratorów i Interfejs API TrwałePołączenie interfejsu API SignalR, połączenie transportowe jest reprezentowane przez warstwę Transports, a połączenie fizyczne jest reprezentowane przez linie między serwerem a klientami.
Podczas wywoływania Start
metody w kliencie signalR udostępniasz kod klienta signalR ze wszystkimi potrzebnymi informacjami w celu nawiązania fizycznego połączenia z serwerem. Kod klienta usługi SignalR używa tych informacji do tworzenia żądania HTTP i ustanawiania połączenia fizycznego, które używa jednej z czterech metod transportu. Jeśli połączenie transportowe nie powiedzie się lub serwer ulegnie awarii, połączenie usługi SignalR nie zniknie natychmiast, ponieważ klient nadal ma informacje potrzebne do automatycznego ponownego ustanowienia nowego połączenia transportowego z tym samym adresem URL usługi SignalR. W tym scenariuszu nie jest zaangażowana żadna interwencja aplikacji użytkownika, a gdy kod klienta usługi SignalR ustanawia nowe połączenie transportowe, nie uruchamia nowego połączenia usługi SignalR. Ciągłość połączenia usługi SignalR jest odzwierciedlana w tym, że identyfikator połączenia, który jest tworzony podczas wywoływania Start
metody, nie zmienia się.
Procedura OnReconnected
obsługi zdarzeń w centrum jest wykonywana po automatycznym ponownym nawiązaniu połączenia transportowego po utracie. Procedura OnDisconnected
obsługi zdarzeń jest wykonywana na końcu połączenia usługi SignalR. Połączenie usługi SignalR może kończyć się dowolnym z następujących sposobów:
- Jeśli klient wywołuje metodę
Stop
, do serwera jest wysyłany komunikat zatrzymania, a zarówno klient, jak i serwer natychmiast kończą połączenie usługi SignalR. - Po utracie łączności między klientem a serwerem klient próbuje ponownie nawiązać połączenie, a serwer czeka na ponowne nawiązanie połączenia z klientem. Jeśli próby ponownego nawiązania połączenia zakończą się niepowodzeniem, a okres przekroczenia limitu czasu rozłączenia zakończy się zarówno na kliencie, jak i na serwerze połączenie usługi SignalR. Klient przestaje próbować ponownie nawiązać połączenie, a serwer usuwa jego reprezentację połączenia usługi SignalR.
- Jeśli klient przestanie działać bez możliwości wywołania
Stop
metody, serwer czeka na ponowne nawiązanie połączenia z klientem, a następnie kończy połączenie usługi SignalR po upływie limitu czasu rozłączenia. - Jeśli serwer przestanie działać, klient spróbuje ponownie nawiązać połączenie (ponownie utworzyć połączenie transportowe), a następnie zakończy połączenie usługi SignalR po upływie limitu czasu rozłączenia.
Jeśli nie występują problemy z połączeniem, a aplikacja użytkownika kończy połączenie usługi SignalR przez wywołanie Stop
metody, połączenie usługi SignalR i połączenie transportu rozpoczynają się i kończą w tym samym czasie. W poniższych sekcjach opisano bardziej szczegółowo inne scenariusze.
Scenariusze rozłączania transportu
Połączenia fizyczne mogą być powolne lub mogą występować przerwy w łączności. W zależności od czynników, takich jak długość przerwy, połączenie transportowe może zostać przerwane. Usługa SignalR próbuje ponownie ustanowić połączenie transportowe. Czasami interfejs API połączenia transportowego wykrywa przerwy i przerywa połączenie transportowe, a usługa SignalR natychmiast stwierdza, że połączenie zostanie utracone. W innych scenariuszach ani interfejs API połączenia transportowego, ani usługa SignalR nie zorientuje się natychmiast, że łączność została utracona. W przypadku wszystkich transportów z wyjątkiem długiego sondowania klient usługi SignalR używa funkcji o nazwie keepalive , aby sprawdzić, czy nie można wykryć łączności z interfejsem API transportu. Aby uzyskać informacje na temat długich połączeń sondowania, zobacz Ustawienia limitu czasu i utrzymania aktywności w dalszej części tego tematu.
Gdy połączenie jest nieaktywne, serwer okresowo wysyła pakiet keepalive do klienta. Od daty pisania tego artykułu domyślna częstotliwość jest co 10 sekund. Nasłuchiwanie tych pakietów umożliwia klientom określenie, czy wystąpił problem z połączeniem. Jeśli pakiet keepalive nie zostanie odebrany w oczekiwany sposób, po krótkim czasie klient zakłada, że występują problemy z połączeniem, takie jak spowolnienie lub przerwy. Jeśli czas utrzymania aktywności nadal nie jest odbierany po dłuższym czasie, klient zakłada, że połączenie zostało przerwane i rozpoczyna próbę ponownego nawiązania połączenia.
Na poniższym diagramie przedstawiono zdarzenia klienta i serwera, które są zgłaszane w typowym scenariuszu, gdy występują problemy z połączeniem fizycznym, które nie są natychmiast rozpoznawane przez interfejs API transportu. Diagram ma zastosowanie do następujących sytuacji:
- Transport to WebSockets, forever frame lub zdarzenia wysyłane przez serwer.
- Istnieją różne okresy przerw w działaniu fizycznego połączenia sieciowego.
- Interfejs API transportu nie zdaje sobie sprawy z przerw, dlatego usługa SignalR korzysta z funkcji utrzymania aktywności, aby je wykryć.
Jeśli klient przechodzi w tryb ponownego nawiązywania połączenia, ale nie może ustanowić połączenia transportowego w ramach limitu czasu rozłączenia, serwer przerywa połączenie usługi SignalR. W takim przypadku serwer wykonuje metodę centrum OnDisconnected
i kolejkuje komunikat rozłączenia w celu wysłania do klienta w przypadku, gdy klient będzie zarządzał nawiązaniem połączenia później. Jeśli klient następnie ponownie nawiązie połączenie, otrzyma polecenie disconnect i wywoła metodę Stop
. W tym scenariuszu OnReconnected
nie jest wykonywane po ponownym połączeniu klienta i OnDisconnected
nie jest wykonywane, gdy klient wywołuje metodę Stop
. Na poniższym diagramie przedstawiono ten scenariusz.
Zdarzenia okresu istnienia połączenia usługi SignalR, które mogą być wywoływane na kliencie, są następujące:
ConnectionSlow
zdarzenie klienta.Podniesione, gdy od czasu odebrania ostatniego komunikatu lub otrzymania polecenia ping na czas utrzymywania aktywności upłynął wstępnie ustawiony odsetek okresu czasu utrzymania aktywności. Domyślny limit czasu utrzymania aktywności wynosi 2/3 limitu czasu utrzymania. Limit czasu utrzymania na żywo wynosi 20 sekund, więc ostrzeżenie występuje około 13 sekund.
Domyślnie serwer wysyła polecenia ping keepalive co 10 sekund, a klient sprawdza, czy są wysyłane polecenia ping na żywo co 2 sekundy (jedna trzecia różnicy między wartością limitu czasu utrzymania aktywności a wartością ostrzeżenia o limitie czasu utrzymania aktywności).
Jeśli interfejs API transportu wie o rozłączeniu, usługa SignalR może zostać poinformowana o rozłączeniu przed upływem okresu ostrzeżenia dotyczącego limitu czasu utrzymania. W takim przypadku
ConnectionSlow
zdarzenie nie zostanie podniesione, a usługa SignalR przejdzie bezpośrednio doReconnecting
zdarzenia.Reconnecting
zdarzenie klienta.Zgłoszone, gdy (a) interfejs API transportu wykryje, że połączenie zostanie utracone lub (b) upłynął limit czasu utrzymania od czasu ostatniego komunikatu lub odebrano polecenie ping na żywo. Kod klienta usługi SignalR rozpoczyna próbę ponownego nawiązania połączenia. To zdarzenie można obsłużyć, jeśli aplikacja ma podjąć jakąś akcję po utracie połączenia transportowego. Domyślny okres limitu czasu utrzymania na żywo wynosi obecnie 20 sekund.
Jeśli kod klienta próbuje wywołać metodę koncentratora, gdy usługa SignalR jest w trybie ponownego łączenia, usługa SignalR spróbuje wysłać polecenie. W większości przypadków takie próby nie powiedzą się, ale w pewnych okolicznościach mogą odnieść sukces. W przypadku zdarzeń wysyłanych przez serwer, na zawsze ramek i długich transportów sondowania usługa SignalR używa dwóch kanałów komunikacyjnych, jeden używany przez klienta do wysyłania komunikatów i jeden używany do odbierania komunikatów. Kanał używany do odbierania jest trwale otwarty i jest to kanał, który jest zamknięty po przerwaniu połączenia fizycznego. Kanał używany do wysyłania pozostaje dostępny, więc jeśli łączność fizyczna zostanie przywrócona, wywołanie metody od klienta do serwera może zakończyć się pomyślnie przed ponownym nawiązaniem kanału odbierania. Wartość zwracana nie zostanie odebrana, dopóki usługa SignalR nie otworzy ponownie kanału używanego do odbierania.
Reconnected
zdarzenie klienta.Podniesione po ponownym utworzeniu połączenia transportowego. Procedura
OnReconnected
obsługi zdarzeń w centrum jest wykonywana.Closed
zdarzenie klienta (disconnected
zdarzenie w języku JavaScript).Podniesiono, gdy okres przekroczenia limitu czasu rozłączenia wygasa, gdy kod klienta usługi SignalR próbuje ponownie nawiązać połączenie po utracie połączenia transportowego. Domyślny limit czasu rozłączenia wynosi 30 sekund. (To zdarzenie jest również wywoływane, gdy połączenie kończy się, ponieważ metoda jest wywoływana
Stop
).
Przerwy w połączeniu transportowym, które nie są wykrywane przez interfejs API transportu i nie opóźniają odbioru poleceń ping keepalive z serwera przez dłuższy niż okres ostrzegawczy limitu czasu utrzymania na żywo, może nie spowodować podniesienia żadnych zdarzeń okresu istnienia połączenia.
Niektóre środowiska sieciowe celowo zamykają bezczynne połączenia, a inną funkcją pakietów keepalive jest pomoc w zapobieganiu temu, pozwalając tym sieciom wiedzieć, że połączenie usługi SignalR jest używane. W skrajnych przypadkach domyślna częstotliwość poleceń ping keepalive może być niewystarczająca, aby zapobiec zamkniętym połączeniom. W takim przypadku można skonfigurować polecenia ping keepalive do wysyłania częściej. Aby uzyskać więcej informacji, zobacz Limit czasu i ustawienia keepalive w dalszej części tego tematu.
Uwaga
Ważne
Sekwencja zdarzeń opisanych tutaj nie jest gwarantowana. Usługa SignalR podejmuje każdą próbę podniesienia zdarzeń okresu istnienia połączenia w przewidywalny sposób zgodnie z tym schematem, ale istnieje wiele odmian zdarzeń sieciowych i wiele sposobów obsługi podstawowych struktur komunikacyjnych, takich jak interfejsy API transportu. Na przykład Reconnected
zdarzenie może nie zostać zgłoszone, gdy klient ponownie się połączy lub OnConnected
program obsługi na serwerze może zostać uruchomiony, gdy próba nawiązania połączenia nie powiedzie się. W tym temacie opisano tylko efekty, które zwykle byłyby generowane przez pewne typowe okoliczności.
Scenariusze rozłączenia klienta
W kliencie przeglądarki kod klienta usługi SignalR, który utrzymuje połączenie usługi SignalR, jest uruchamiany w kontekście języka JavaScript strony internetowej. Dlatego połączenie usługi SignalR musi zakończyć się po przejściu z jednej strony do innej i dlatego istnieje wiele połączeń z wieloma identyfikatorami połączeń, jeśli łączysz się z wielu okien przeglądarki lub kart. Gdy użytkownik zamknie okno przeglądarki lub kartę albo przejdzie do nowej strony lub odświeży stronę, połączenie usługi SignalR natychmiast się kończy, ponieważ kod klienta usługi SignalR obsługuje to zdarzenie przeglądarki i wywołuje metodę Stop
. W tych scenariuszach lub na dowolnej platformie klienta, gdy aplikacja wywołuje Stop
metodę, OnDisconnected
program obsługi zdarzeń jest wykonywany natychmiast na serwerze, a klient zgłasza Closed
zdarzenie (zdarzenie ma nazwę disconnected
w języku JavaScript).
Jeśli aplikacja kliencka lub komputer, na którym jest uruchomiona, ulega awarii lub przechodzi w stan uśpienia (na przykład gdy użytkownik zamknie laptopa), serwer nie jest informowany o tym, co się stało. Jeśli serwer wie, utrata klienta może być spowodowana przerwą w łączności, a klient może próbować ponownie nawiązać połączenie. W związku z tym w tych scenariuszach serwer czeka, aby dać klientowi szansę na ponowne nawiązanie połączenia i OnDisconnected
nie zostanie wykonany do momentu wygaśnięcia limitu czasu rozłączenia (domyślnie około 30 sekund). Na poniższym diagramie przedstawiono ten scenariusz.
Scenariusze rozłączenia serwera
Gdy serwer przechodzi w tryb offline — uruchamia się ponownie, kończy się niepowodzeniem, odtwarzaniem domeny aplikacji itp. — wynik może być podobny do utraconego połączenia lub interfejs API transportu i signalR może natychmiast wiedzieć, że serwer zniknął, a usługa SignalR może zacząć próbować ponownie nawiązać połączenie bez zgłaszania ConnectionSlow
zdarzenia. Jeśli klient przejdzie w tryb ponownego połączenia, a jeśli serwer odzyska lub uruchomi ponownie lub nowy serwer zostanie przełączony w tryb online przed wygaśnięciem limitu czasu rozłączenia, klient ponownie połączy się z przywróconym lub nowym serwerem. W takim przypadku połączenie usługi SignalR będzie kontynuowane na kliencie, a Reconnected
zdarzenie jest wywoływane. Na pierwszym serwerze OnDisconnected
nigdy nie jest wykonywany, a na nowym serwerze jest wykonywany, OnReconnected
chociaż OnConnected
nigdy wcześniej nie został wykonany dla tego klienta na tym serwerze. (Efekt jest taki sam, jeśli klient ponownie nawiąże połączenie z tym samym serwerem po ponownym uruchomieniu lub ponownym uruchomieniu domeny aplikacji, ponieważ po ponownym uruchomieniu serwera nie ma pamięci wcześniejszej aktywności połączenia). Na poniższym diagramie założono, że interfejs API transportu natychmiast zdaje sobie sprawę z utraconego połączenia, więc ConnectionSlow
zdarzenie nie jest zgłaszane.
Jeśli serwer nie stanie się dostępny w ramach limitu czasu rozłączenia, połączenie usługi SignalR kończy się. W tym scenariuszu Closed
zdarzenie (disconnected
w klientach JavaScript) jest wywoływane na kliencie, ale OnDisconnected
nigdy nie jest wywoływane na serwerze. Na poniższym diagramie założono, że interfejs API transportu nie zdaje sobie sprawy z utraconego połączenia, dlatego jest wykrywany przez funkcję keepalive usługi SignalR i ConnectionSlow
zgłaszane jest zdarzenie.
Limit czasu i ustawienia keepalive
Domyślne ConnectionTimeout
wartości , i KeepAlive
są odpowiednie dla większości scenariuszy, DisconnectTimeout
ale można je zmienić, jeśli środowisko ma specjalne potrzeby. Jeśli na przykład środowisko sieciowe zamyka połączenia bezczynne przez 5 sekund, może być konieczne zmniejszenie wartości keepalive.
Connectiontimeout
To ustawienie reprezentuje czas, przez jaki połączenie transportowe jest otwarte i czeka na odpowiedź przed jego zamknięciem i otwarciem nowego połączenia. Wartość domyślna to 110 sekund.
To ustawienie ma zastosowanie tylko wtedy, gdy funkcja keepalive jest wyłączona, co zwykle ma zastosowanie tylko do długiego transportu sondowania. Na poniższym diagramie przedstawiono wpływ tego ustawienia na długie sondowanie połączenia transportowego.
DisconnectTimeout
To ustawienie reprezentuje czas oczekiwania po utracie połączenia transportowego przed podniesieniem Disconnected
zdarzenia. Wartość domyślna to 30 sekund. Po ustawieniu parametru DisconnectTimeout
KeepAlive
jest automatycznie ustawiana wartość 1/3 DisconnectTimeout
wartości.
Keepalive
To ustawienie reprezentuje czas oczekiwania przed wysłaniem pakietu keepalive przez bezczynne połączenie. Wartość domyślna to 10 sekund. Ta wartość nie może być większa niż 1/3 DisconnectTimeout
wartości.
Jeśli chcesz ustawić zarówno , jak DisconnectTimeout
i KeepAlive
, ustaw KeepAlive
po DisconnectTimeout
. KeepAlive
W przeciwnym razie ustawienie zostanie zastąpione, gdy DisconnectTimeout
ustawienie zostanie automatycznie ustawiona KeepAlive
na 1/3 wartości limitu czasu.
Jeśli chcesz wyłączyć funkcję keepalive, ustaw wartość KeepAlive
null. Funkcja Keepalive jest automatycznie wyłączona dla długiego transportu sondowania.
Jak zmienić limit czasu i ustawienia keepalive
Aby zmienić wartości domyślne dla tych ustawień, ustaw je w Application_Start
pliku Global.asax , jak pokazano w poniższym przykładzie. Wartości wyświetlane w przykładowym kodzie są takie same jak wartości domyślne.
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);
}
Jak powiadomić użytkownika o rozłączeniach
W niektórych aplikacjach możesz wyświetlić użytkownikowi komunikat, gdy występują problemy z łącznością. Istnieje kilka opcji, aby dowiedzieć się, jak i kiedy to zrobić. Poniższe przykłady kodu są przeznaczone dla klienta JavaScript przy użyciu wygenerowanego serwera proxy.
Obsługa zdarzenia w celu wyświetlenia komunikatu
connectionSlow
, gdy tylko usługa SignalR jest świadoma problemów z połączeniem, zanim przejdzie do trybu ponownego połączenia.$.connection.hub.connectionSlow(function() { notifyUserOfConnectionProblem(); // Your function to notify user. });
Obsługa zdarzenia w celu wyświetlenia komunikatu
reconnecting
, gdy usługa SignalR jest świadoma rozłączenia i przechodzi w tryb ponownego nawiązywania połączenia.$.connection.hub.reconnecting(function() { notifyUserOfTryingToReconnect(); // Your function to notify user. });
Obsługa zdarzenia w celu wyświetlenia komunikatu po przekroczeniu
disconnected
limitu czasu próby ponownego nawiązania połączenia. W tym scenariuszu jedynym sposobem ponownego nawiązania połączenia z serwerem jest ponowne uruchomienie połączenia usługi SignalR przez wywołanieStart
metody , co spowoduje utworzenie nowego identyfikatora połączenia. Poniższy przykładowy kod używa flagi, aby upewnić się, że powiadomienie jest wystawiane dopiero po ponownym połączeniu limitu czasu, a nie po normalnym zakończeniu połączenia usługi SignalR spowodowanego wywołaniemStop
metody.var tryingToReconnect = false; $.connection.hub.reconnecting(function() { tryingToReconnect = true; }); $.connection.hub.reconnected(function() { tryingToReconnect = false; }); $.connection.hub.disconnected(function() { if(tryingToReconnect) { notifyUserOfDisconnect(); // Your function to notify user. } });
Jak stale ponownie nawiązować połączenie
W niektórych aplikacjach możesz chcieć automatycznie ponownie nawiązać połączenie po jego utracie, a próba ponownego nawiązania połączenia przekroczyła limit czasu. W tym celu można wywołać metodę Start
z Closed
programu obsługi zdarzeń (disconnected
program obsługi zdarzeń na klientach JavaScript). Możesz poczekać pewien czas przed wywołaniem wywołania Start
, aby uniknąć zbyt częstego wykonywania tej czynności, gdy serwer lub połączenie fizyczne są niedostępne. Poniższy przykład kodu dotyczy klienta JavaScript przy użyciu wygenerowanego serwera proxy.
$.connection.hub.disconnected(function() {
setTimeout(function() {
$.connection.hub.start();
}, 5000); // Restart connection after 5 seconds.
});
Potencjalny problem, który należy wziąć pod uwagę w klientach mobilnych, polega na tym, że ciągłe próby ponownego połączenia, gdy serwer lub połączenie fizyczne nie jest dostępne, może spowodować niepotrzebne opróżnienie baterii.
Jak odłączyć klienta w kodzie serwera
Usługa SignalR w wersji 1.1.1 nie ma wbudowanego interfejsu API serwera do odłączania klientów. Istnieją plany dodawania tej funkcji w przyszłości. W bieżącej wersji usługi SignalR najprostszym sposobem odłączenia klienta od serwera jest zaimplementowanie metody rozłączenia na kliencie i wywołanie tej metody z serwera. Poniższy przykładowy kod przedstawia metodę rozłączenia klienta JavaScript przy użyciu wygenerowanego serwera proxy.
var myHubProxy = $.connection.myHub
myHubProxy.client.stopClient = function() {
$.connection.hub.stop();
};
Ostrzeżenie
Zabezpieczenia — ani ta metoda rozłączania klientów, ani proponowanego wbudowanego interfejsu API nie rozwiąże scenariusza zhakowanych klientów, którzy uruchamiają złośliwy kod, ponieważ klienci mogą ponownie nawiązać połączenie lub kod zhakowany może usunąć stopClient
metodę lub zmienić to, co robi. Odpowiednie miejsce do wdrożenia ochrony stanowej typu "odmowa usługi" (DOS) nie znajduje się w strukturze ani w warstwie serwera, ale raczej w infrastrukturze frontonu.