WCF ChannelFactory vs generating proxy

Zastanawiam się, w jakich okolicznościach wolałbyś wygenerować proxy z usługi WCF, kiedy możesz po prostu wywoływać połączenia za pomocą ChannelFactory?

W ten sposób nie będziesz musiał generować proxy i martwić się o regenerację proxy po aktualizacji serwera?

Thanks

Author: SteveC, 2009-11-09

6 answers

Istnieją 3 podstawowe sposoby tworzenia klienta WCF:

  1. Pozwól programowi Visual Studio wygenerować serwer proxy. To auto generuje kod, który łączy się z usługą poprzez odczytanie WSDL. Jeśli usługa ulegnie zmianie z jakiegokolwiek powodu, musisz ją zregenerować. Dużą zaletą jest to, że jest łatwy w konfiguracji - VS ma kreatora i wszystko jest automatyczne. Wadą jest to, że polegasz na VS zrobić całą ciężką pracę dla Ciebie, a więc tracisz kontrolę.

  2. Użyj ChannelFactory z znany interfejs. Polega to na posiadaniu lokalnych interfejsów opisujących usługę (umowa serwisowa). Dużą zaletą jest to, że można zarządzać zmianami znacznie łatwiej - nadal trzeba przekompilować i naprawić zmiany, ale teraz nie regenerujesz kodu, odnosisz się do nowych interfejsów. Zwykle jest to używane, gdy kontrolujesz zarówno serwer, jak i klienta, ponieważ oba mogą być znacznie łatwiej wyśmiewane dla testów jednostkowych. Jednak interfejsy mogą być napisane dla każdej usługi, nawet tych REST-zobacz w Ten Twitter API .

  3. Napisz własny serwer proxy - jest to dość łatwe do zrobienia, szczególnie w przypadku usług REST, za pomocą HttpClient lub WebClient. Daje to najbardziej precyzyjną kontrolę ziarna, ale kosztem wielu API usług jest w ciągach. Na przykład: var content = new HttpClient().Get("http://yoursite.com/resource/id").Content; - Jeśli szczegóły zmiany API nie napotkasz błędu przed uruchomieniem.

Osobiście nigdy nie lubiłem opcji 1 - poleganie na automatycznie wygenerowanym kodzie jest niechlujne i traci zbyt dużą kontrolę. Plus często stwarza to problemy z serializacją - kończę z dwiema identycznymi klasami (jedną w kodzie serwera, jedną wygenerowaną automatycznie), które mogą być tided up, ale jest to ból.

Opcja 2 powinna być idealna, ale kanały są trochę zbyt ograniczające - na przykład całkowicie tracą zawartość błędów HTTP. To powiedziawszy posiadanie interfejsów opisujących usługę jest znacznie łatwiejsze do kodowania i utrzymywania.

 84
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:30

Używam ChannelFactory wraz z MetadataResolver.Metoda Resolve. Konfiguracja klienta jest kłopotliwa, więc mój punkt serwisowy dostaję z serwera.

Kiedy używasz ChannelFactory (of T), T jest albo oryginalnym kontraktem, który możesz uzyskać z referencji w Twoim projekcie, albo wygenerowaną instancją kontraktu. W niektórych projektach wygenerowałem kod z odniesienia do usługi, ponieważ nie mogłem dodać odniesienia do DLL umowy. Możesz nawet wygenerować umowę asynchroniczną z usługą odwołaj się i korzystaj z interfejsu umowy z ChannelFactory.

Głównym punktem korzystania z ChannelFactory dla mnie było pozbycie się informacji o konfiguracji klienta WCF. W przykładowym kodzie poniżej możesz zobaczyć, jak uzyskać klienta WCF bez konfiguracji.

Dim fixedAddress = "net.tcp://server/service.svc/mex"
Dim availableBindings = MetadataResolver.Resolve(GetType(ContractAssembly.IContractName), New EndpointAddress(fixedAddress))
factoryService = New ChannelFactory(Of ContractAssembly.IContractName)(availableBindings(0))
accesService = factoryService.CreateChannel()

W moim ostatecznym projekcie, dostępne linki są sprawdzane, aby użyć net.tcp lub net.rura, jeśli jest dostępna. W ten sposób mogę użyć najlepszej dostępnej oprawy dla moich potrzeb. Polegam tylko na tym, że metadane istnieją na serwer.

Mam nadzieję, że to pomoże

BTW, robi się to za pomocą. NET 3.5. Jednak działa również z 4.0.

 20
Author: Jean-Michel Bezeau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-08 15:30:48

Aby korzystać z ChannelFactory<T> musisz być skłonny do dzielenia się zestawieniami umów między serwisem a klientem. Jeśli ci to nie przeszkadza, ChannelFactory<T> może zaoszczędzić Ci trochę czasu.

 11
Author: Andrew Hare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-08 23:21:30

Proxy zbuduje funkcje asynchroniczne, dla których jest to całkiem miłe.

 9
Author: Aaron Fischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-09 01:19:29

Moja odpowiedź jest rodzajem podsumowania Keitha I Andrew Hare odpowiedzi.

Jeśli nie kontrolujesz serwera, ale masz tylko WSDL / URL-Wygeneruj proxy za pomocą Visual Studio lub svcutil. (Zauważ, że Visual Studio czasami zawodzi, gdy svcutil działa lepiej).

Gdy kontrolujesz zarówno serwer jak i klienta, współdziel interfejsy / kontrakty i call ChannelFactory
.

 7
Author: Michael Freidgeim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:14

To nie tylko kwestia czasu. Korzystanie z wygenerowanego serwera proxy WSDL jest niebezpieczne, ponieważ jeśli zapomnisz zaktualizować odniesienie do usługi, możesz pozostawić rozwiązanie w niespójnym stanie. Wszystko się zgadza, ale umowa serwisowa jest zerwana. Zdecydowanie sugeruję, aby używać ChannelFactory, gdy tylko jest to możliwe, ułatwiasz sobie życie.

Ewentualną alternatywą może być napisanie prebuildowego skryptu, który wywołuje narzędzie SVCUtil, aby utworzyć proxy za każdym razem, gdy budujesz swój projekt, ale w każdym razie ChannelFactory jest znacznie bardziej schludny i elegancki.

 2
Author: Paolo Costa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-18 14:23:53