2011-01-02 13 views
8

Po prostu uczę się liny wokół WCF. To, co planowałem zrobić, to mieć otwarty kanał dupleksowy między klientem a serwerem za pomocą NetTcpBinding i pozostawać otwarty przez czas nieokreślony, aby serwer mógł inicjować żądania do klienta.WCF - czy źle jest pozostawić kanał otwarty przez długi czas?

Potem natknąłem się na to blog by Jesse Ezell, co zdaje się wskazywać, że Złe Rzeczy mają na celu utrzymanie otwartego kanału na czas nieokreślony, ponieważ nie można złapać błędów, a to powoduje wszelkiego rodzaju niestabilności.

Czy to prawda? Jeśli używam NetTcpBinding i utrzymuję referencję do otwartego kanału po obu stronach relacji, co się stanie, jeśli wystąpi błąd komunikacji? Jak złapię zdarzenie awarii? Jakie są inne bonusy? Czy jest jakaś różnica, z której platformy .NET korzystasz? (Jestem na 4.0.)

Odpowiedz

13

Nie zgadzam się z Jesse (Na marginesie: on zaleca również użyć klas usług WCF jako pojedynczych domyślnie który jest najgorszy pomysł kiedykolwiek moim zdaniem) .....

Dopóki starannie obchodzisz się z wyjątkami na serwerze (np. Implementując interfejs IErrorHandler w swojej klasie usług), nie ma sensu dalej blokować twojego kanału ... szczególnie nie w korporacyjnym środowisku LAN używającym netTcpBinding.

W przeciwieństwie do np. połączenie z bazą danych, które często wiąże się z kosztami licencjonowania, utrzymywanie połączenia sieciowego z urządzeniem serwisowym otwartym nie powinno powodować żadnych problemów. Zwykle nie jest to ograniczone źródło, więc ciągłe otwieranie i zamykanie go wydaje się bezcelowe.

Jeśli utrzymujesz kanał serwisowy otwarty przez dłuższy czas, musisz mieć możliwość obsługi po stronie klienta, aby obsługiwać usterki - np. musisz być w stanie odzyskać od sytuacji, w której kanał został uszkodzony, gdy wystąpił wyjątek (na przykład sieć jest wyłączona lub coś w tym stylu).

Ale jeśli to zrobisz, nie widzę żadnej korzyści z ciągłego zamykania twojego kanału po każdym połączeniu i ponownego otwierania na następny ...

6

Tak, dobrze jest zamknąć kanał, gdy tylko nie jest już potrzebny. Ale nie jest to normalne w przypadku komunikacji dwustronnej. Podczas korzystania z komunikacji dwustronnej potrzebny jest otwarty kanał, aby umożliwić serwerowi wysyłanie wiadomości z powrotem do klienta. Komunikacja WCF jest zawsze inicjowana przez klienta. Oddzwanianie jest dozwolone tylko przez zachowanie kanału zainicjowanego przez klienta.

Komunikacja dwustronna wiąże się z dodatkowymi zadaniami do obsługi awarii połączenia. Twoja usługa powinna zawierać pewien mechanizm pingowania, aby umożliwić klientowi sprawdzenie połączenia w regularnych odstępach czasu. Jeśli połączenie nie powiedzie się, klient otrzyma wyjątek i będzie można ponownie ustanowić połączenie. Również usługa powinna obsługiwać wyjątek podczas wysyłania wiadomości oddzwonienia do kanału, na którym wystąpił błąd.

Powiązane problemy