2013-02-18 12 views
7

Używam SignalR w mojej aplikacji. Mam aplikację, która w bardzo dużym stopniu zależy od tego, czy OnDisconnected() jest poprawnie wywoływana. I nazywa się prawidłowo w następujących okolicznościach:SignalR rozłącz nie jest wywoływany przy rozłączeniu/ponownym połączeniu z Internetem

public Task OnDisconnected() 
{ 
    try 
    { 
     DeleteUser(Context.ConnectionId); 
     return null; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 
} 
  1. Użytkownik odświeża stronę
  2. użytkownik przechodzi do nowej strony
  3. użytkownik zamknie przeglądarkę

jednak nie jest wywoływana, jeśli połączenie sieciowe nagle spada. Na przykład, jeśli odłączę kabel sieciowy od komputera klienta, lub wyłączę sieć bezprzewodową klienta, lub odłączę router, OnDisconnected() nigdy nie zostanie wywołany, nawet po kilku minutach oczekiwania.

+0

Nie pracowałem z SignalR tak wiele, ale jestem pewien, że nie jest to jedna z jego funkcjonalności do sprawdzenia, jeśli użytkownik jest nadal podłączony do koncentratora. Możesz zaimplementować swój własny zegar, który wyloguje użytkownika po (x) minutach. – Timsen

+0

Po prostu nad tym linkiem może ci pomóc: http://www.dotnetcurry.com/ShowArticle.aspx?ID=826 – Timsen

Odpowiedz

6

Podniesie się odłączony, ale nie natychmiast. Istnieje konfigurowalny próg (domyślnie 30 sekund), który SignalR będzie czekać (po tym, jak podstawowe połączenie tcp zniknie i to nie jest natychmiastowe), zanim uzna klienta odłączonego. Jeśli połączenie spadnie i ponownie się połączy przed skonfigurowanym czasem oczekiwania, to nie podniesie OnDisconnected.

Jeśli nigdy nie widzisz, że został on podniesiony w jakimś scenariuszu po odczekaniu przez chwilę, może to być błąd. SignalR 1.0 został wydany dzisiaj, więc zachęcam do wypróbowania tego również i zobacz, czy nadal widzisz problem.

+0

Ok dzięki dfowler..i użyje sygnału r 1.0, teraz używam sygnału r 0.5.3 – user1527989

+1

David, czy 'HttpContext.Response.ClientDisconnectedToken' jest honorowany, gdy hostujemy SignalR w ASP.NET 4.5 + IIS 8.0? – tugberk

+2

Nie używamy go, ponieważ jest w nim błąd. Ale kiedy to naprawimy, użyjemy go. – davidfowl

2

To może nie być właściwą odpowiedź, ale to, co wiem:

Nie będzie mógł zobaczyć wydarzenie OnDisconnected wystrzelił nagle, gdy połączenie jest odrzucany z powodu SignalR nie zapisuje ją w dół (to pule do połączenia z zadaniem w tle, aby sprawdzić, czy połączenie nie działa w określonym przedziale). Kiedy zamykasz przeglądarkę, domyślam się, że SignalR wysyła żądanie do serwera, aby zasygnalizować rozłączenie zdarzenia. Dlatego nagle zobaczysz, że wydarzenie zostało zwolnione.

Jednak ASP.NET 4.5 ma właściwość CancellationToken o nazwie ClientDisconnectedToken dla HttpContext.Response, która jest sygnalizowana po zerwaniu połączenia TCP. Działa to tylko w IIS 8.0, o ile wiem, i nie jestem pewien, czy SignalR działa z tym hostem ASP.NET 4.5 .NET 4.5.

Powiązane problemy