2009-03-20 16 views
5

Jak mogę obsłużyć rozłączenia klienta WCF?Jak obsługiwać rozłączanie klienta WCF

I Próbowałem CallBacks, ale wydaje się, że działa tylko wtedy, gdy Klient Odłącza "wyraźnie" za pomocą przycisku "Rozłącz" na przykład.

Chcę, aby mój serwer był powiadamiany, gdy Klient zostanie rozłączony, nawet po ręcznym rozłączeniu lub awarii procesu klienta.

+0

Twoje pytanie jest niejasne. Czy próbujesz połączyć się z limitem czasu lub masz ręczne połączenie/rozłączenie? –

+0

Chcę, aby mój serwer był powiadamiany, gdy Klient zostanie rozłączony, nawet po ręcznym rozłączeniu lub awarii procesu klienta. –

Odpowiedz

0

Dlaczego nie mieć pętli, w której klient po prostu wywołuje usługę co sekundę, a następnie wykonuje wywołanie zwrotne. gdy wywołanie zwrotne nie powiedzie się, klient odłączył się.

0

Wariantem odpytywania byłoby użycie wiadomości. Klient może wysłać wiadomość "Jestem tutaj", a następnie usunąć wiadomość po jej rozłączeniu. Serwer może monitorować kolejkę pod kątem rozłączeń. Inną opcją jest użycie BOSH, dwukierunkowej komunikacji HTTP. Właśnie tego używają klienci czatu.

7

Użyj zdarzeń OperationContext.Current.Channel.Faulted i OperationContext.Current.Channel.Closed.

Te zdarzenia są uruchamiane, gdy klient został odłączony z dowolnego powodu.

+0

Zdarzenie OperationContext.Current.Channel.Closed nie uruchamia się w dowolnym momencie ... Chcę, aby wydarzenie się zaczęło kiedy zamykam klienta WinForm ... Używam wsDualHttpBinding w WCF. Jak korzystać z tego wydarzenia? – Oliboy50

0

Powiedziałbym, że jeśli klient rozłącza się w nietypowy sposób, nie ma możliwości upewnienia się, że serwer będzie tego świadomy. To prawie jak HTTP. Jeśli zamkniemy przeglądarkę, powiedzmy z przymusem, przeglądarka niczego nie wyśle ​​na serwer.

To jeden z wielu powodów, dla których mamy limit czasu sesji. Aby odłączyć klienta i wyczyścić po stronie serwera wszystko, co jest używane, gdy klient robi coś złego (na przykład zbyt długie operacje) lub rozłącza się bez powiadamiania serwera.

0
if (HttpContext.Current.Response.IsClientConnected == false) 
{ 
..} 

może pomóc

Powiązane problemy