2012-01-23 14 views
6

Mam poczucie gospodarzem usług wcf przy użyciu wywołania zwrotnego tcp dupleksu nettoWCF zwrotna tcp dupleksu netto tylko 1 sposób zarzucić

po stronie klienta, słucham na razie na nic zarzucić Channel i ChennelFactory. po uszkodzeniu kanału klient odtworzy kanał i ponownie go zasubskrybuje.

po stronie serwera, przechowuję kanał zwrotny i zapisuję numer referencyjny kanału, dzwoniąc pod numer OperationContext.Current.Channel, aby umożliwić odsłuchanie zakończonego błędem i zamkniętego zdarzenia na tym kanale. W przypadku błędu serwer usunie tego subskrybenta.

To działa przez większość czasu, aż do niedawna zaobserwowałem nieoczekiwane zachowanie: kanał zwrotny jest uszkodzony na serwerze, ale kanał wydaje się być w porządku po stronie klienta, co prowadzi do tego, że klient nie subskrybuje ponownie, gdy serwer został już usunięty abonent i klient nie otrzymają żadnego połączenia zwrotnego.

Myślałem, że w komunikacji dwustronnej, jeśli wykryty zostanie jeden koniec błędu, kanał dupleksowy powinien zostać uszkodzony.

Niezawodny sesja jest włączony i czas oczekiwania jest bardzo długi (2 godziny) (może to może prowadzi do klienta końcowego usterkę czujnika nie wystarczająco szybki?)

Czy ktoś może wyjaśnić, dlaczego tak się dzieje?

Innym pytaniem jest, dlaczego jest on wadliwy? Mam 40 klientów połączonych, ale serwer wykrył losowego klienta, którego dotyczy błąd w losowym czasie.

Odpowiedz

2

Nie jestem pewien z tego powodu. Ale przypuszczam, że kanał może zawieść w taki sposób, że zakłócone zdarzenie nigdy nie dociera do klienta lub serwera. Należy również wziąć pod uwagę przypadek, w którym klient szybko się zawiesza.

W każdym razie W moim projekcie doszedłem do wniosku, że poleganie na błędnych zdarzeniach w kanałach nie jest wystarczająco wiarygodne. Więc regularnie wysyłam ping do wszystkich subskrybentów z serwera przez kanał zwrotny. Jeśli klient nie odpowie w ramach limitu czasu, zostanie usunięty z listy subskrybentów.

Ze strony klienta można również przechwycić wyjątki limitu czasu i odtworzyć kanał, jeśli jest to konieczne.

1

Długie przerwy w czasie nie są powodem do winy, jestem pewien, ponieważ znajduję się w identycznej sytuacji i doświadczyłem również problemu z krótkimi opóźnieniami.

Radzenie sobie z uszkodzonymi kanałami po stronie usługi jest łatwe. Możesz spróbować/złapać wokół wywołania zwrotnego i radzić sobie z nim tylko wtedy, gdy faktycznie go potrzebujesz.

Po stronie klienta, nie widzę żadnego rozsądnego sposobu robienia tego. Mam nadzieję, że ktoś coś tutaj zaproponuje ...

Powiązane problemy