2009-11-05 4 views
5

Używam usługi WCF i utworzyłem jej proxy przy użyciu odwołania do usługi VS 2008.Inicjalizacja proxy klienta WCF

szukam najlepszego wzorca, aby wywołać metodę usługa WCF

  • należy utworzyć instancję proxy klienta za każdym razem wywołujemy metodę usługi i zamknąć klienta najszybciej jak to mam zrobić z tym? Kiedy profilowałem moją aplikację kliencką, mogłem zobaczyć, że uzyskanie kanału w trakcie inicjowania klienta proxy zajmuje dużo czasu. Należy użyć wzorca Singleton dla proxy klienta, aby móc użyć tylko jednej instancji i uzyskać pozbyć się ponownej inicjalizacji narzutów? Czy jest jakiś ukryty problem z tym podejściem?

Korzystam z .Net framework 3.5 SP1, basicHttp binding with little customization.

+0

@ 123Developer: świetnie - dzięki! (nie jest to "oczywiste" dla początkujących - zgadzam się - dlatego to wskazuję) –

Odpowiedz

10

To zależy ;-)

Jeśli masz sekwencję w swojej aplikacji, która wymaga kilku połączeń po siebie, można powiesić na kliencie proxy i nadal używać go do dalszych rozmów. Należy jednak pamiętać, aby sprawdzić stan "błędu" - w przypadku wystąpienia błędu na serwerze kanał między proxy klienta a serwerem może zostać "uszkodzony", a zatem serwer proxy klienta stanie się bezużyteczny.

Również - kosztowną częścią jest stworzenie ChannelFactory<T> - można próbować oddzielić te dwa kroki, gdy utworzysz proyx klienta w kodzie:

ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>(); 

powiesić na tej fabryki kanału, na przykład Pamięć podręczna to gdzieś

Drugim krokiem powinno być znacznie mniej intensywny pod względem czasu i moc:

IYourService client = factory.CreateChannel(); 

można zrobić ten krok przed każdym wywołaniu (lub zadzwonić sekwencja) i nie powinny dostać się złe wyniki z tego, naprawdę.

Zdecydowanie polecam unikać singletonów, kiedy tylko jest to możliwe - to tak, jak otwieranie puszki z robakami, nie rób tego, chyba że absolutnie, pozytywnie musisz (np. Zarządzać dostępem do pojedynczego zasobu, który jest dostępny tylko dla jednego rozmówcy na czas).

Marc

+1

Zgadzam się z podejściem polegającym na tworzeniu pojedynczej instancji fabrycznej i braku instancji pojedynczego kanału. W przypadku kanałów użyj em i loose i upewnij się, że zamykasz je poprawnie, sprawdzając stan błędu. – CodingWithSpike

0

Przepraszamy za wzniecając stare pytanie, ale chciałem dodać to do łatwego odniesienia.

W pełni zgadzam się z marc_s i rally25rs. Zacznij więc od tego, ale zastanów się też nad używaniem proxy lub opakowania obsługującego stany z błędami. Here is a question na SO, który omawia niektóre rozwiązania, i here is another dobre rozwiązanie natknąłem się na Internecie przez Corneliu, "Budowanie wielokrotnego użytku ClientBase proxy". Jego rozwiązanie generuje owijki, które eksponują twoje metody serwisowania dla maksymalnej wygody i wydajności. Nadal muszę sprawdzić, czy to działa :).