2012-03-01 21 views
17

Mam oba końce dwukierunkowego połączenia Stream, na którym chcę wykonać trochę komunikacji. Podstawowa implementacja strumienia nie jest ważna, chcę pracować na poziomie Stream ...Używanie WCF do owijania istniejącego połączonego strumienia

Zamiast zaimplementować własny protokół komunikacyjny dla strumienia, chcę użyć całej istniejącej dobroci WCF do owinięcia istniejący strumień z dwukierunkowym kanałem komunikacyjnym WCF (żądanie/odpowiedź + oddzwonienie).

Moje pytanie brzmi: jak mogę to zrobić ...?

UPDATE:

Poszedłem ścieżką wdrożenia transport własny. Mam tej pracy, ale nadal nie jestem całkowicie zadowolony z niego ...

Mam wdrożyła IDuplexSessionChannel zawinąć strumienia, wraz z odpowiednim IChannelFactory i IChannelListener i wiążącej element tworzenia kanału fabryki. Teraz przechodzę przez podłączony strumień i ostatecznie przekazuję go do kanału transportowego, gdy jest on tworzony.

Więc mogę utworzyć proxy klienta dostępu do usługi za pomocą strumienia w następujący sposób:

var callback = new MyCallback(); 
var instanceContext = new InstanceContext(callback); 
var pipeFactory = new DuplexChannelFactory<IMyService>(instanceContext, new StreamBinding(clientStream), 
                 new EndpointAddress("stream://localhost/MyService")); 
var serviceProxy = pipeFactory.CreateChannel(); 

Mam problem jest, jak się wydaje WCF jest ustawiony na użyciu ServiceHost stworzyć koniec serwera kanał, poprzez IChannelListener. W moim przypadku mam już podłączony strumień i nie będę mógł słuchać kolejnych połączeń przychodzących. Mogę obejść to, ale wolałbym nie używać numeru ServiceHost, aby utworzyć koniec serwera kanału, ponieważ w końcu mam dużo niejasnych schematów i hacków, aby działał.

Pytania

Czekam zatem do lepszego sposobu na podjęcie IDuplexSessionChannels, i owinąć je do pełnomocnika kanału zarówno na serwerze i kończy klienta.

A może inna implementacja ServiceHost, która nie wymaga IChannelListener.

Naprawdę, problem polega na tym, że nie chcę pojedynczego serwera, wielu układów klienta, mam relację 1-1 między moją usługą WCF a klientem. Czy istnieje poprawny sposób utworzenia wystąpienia jednego z nich?

Chcę powiedzieć, że chcę utworzyć instancję usługi po stronie serwera bez użycia ServiceHost.

Wszelkie sugestie będą mile widziane na tym etapie.

+0

Wygląda na to, że możesz pomylić rolę hosta usługi WCF i instancji usługi WCF. Host usługi WCF udostępnia wystąpienia usługi opartej na instancjiContextMode. Ten [wpis na blogu] (http://www.danrigsby.com/blog/index.php/2008/05/23/understanding-instancecontext-in-wcf/) zawiera dobre wyjaśnienie, jak to działa.Naprawdę nie możesz mieć instancji usługi WCF bez dostarczania jej przez ServiceHost. Z kolei ServiceHost ma zależność od ChannelListener do zarządzania infrastrukturą przesyłania wiadomości. Bez niego miałbyś "głuchy" ServiceHost :) –

+0

Tak, więc próbuję zrobić rzeczy 'ServiceHost', aby utworzyć instancję' InstanceContext' i Service. 'ServiceHost' musi to zrobić, gdy akceptuje nowe połączenie przychodzące. Mam już ustalone połączenie, więc chcę pominąć część odsłuchową. Na pewno nie jest to * niemożliwe * ...? – Mark

+0

@ Mark To dla mnie to jak wzięcie istniejącego tunelu i zbudowanie kolejnego tunelu, żeby go zawrzeć ... WCF nie został zbudowany na tego typu rzeczy ... jaki jest dokładnie problem z istniejącym strumieniem (który piszesz działa) Czy uważasz, że korzystanie z WCF rozwiąże problem? – Yahia

Odpowiedz

0

Użyj klienta po obu stronach. Będziesz jednak musiał dokładnie określić swoje kontrakty. Jeśli masz ClientA i ClientB na każdym końcu strumienia, gdy ClientA wyśle ​​żądanie, ClientB będzie oczekiwał, że będzie wyglądać tak, jak widzi zdefiniowaną przez siebie umowę typu callback i odwrotnie.

Powiązane problemy