2011-01-24 16 views
8

Próbuję napisać jakiś kod w języku C#, który wywoła usługę WCF w locie, importując plik WSDL, badając go, a następnie dynamicznie wywołując wywołania.Wywołanie usługi WCF bez generowania zespołu

Usługa, którą wywołuję, może się zmieniać od czasu do czasu - więc jeśli tak, chcę, aby mój klient wiedział o nowych metodach i nowych parametrach wejściowych i parametrach wyjściowych do wywołań, bez odbudowywania mojego klienta.

Jednym z możliwych rozwiązań jest zaimportowanie i skompilowanie referencji do usługi w locie.

Opisane tutaj: Creating an assembly on the fly from a WSDL

to do uniknięcia powstawania zespołu i odzwierciedla się to, jeżeli to możliwe.

Sprawdziłem kod dynamicznego proxy w łączu i do zaimportowania wykorzystano klasę szkieletową. Ta klasa to WsdlImporter. Tak więc pomyślałem sobie świetnie - mogę to wykorzystać i zbadać schemat WSDL i określić, jakie połączenia są obecne oraz jakie wejścia i wyjścia są dostępne.

Problem polega na tym, że w obiektach MessagePartDescription brakuje informacji o typie, które tworzy WsdlImporter. Najwyraźniej tego brakuje because it cannot find the types yet - see the response to the question from Brian.

Tak więc jakakolwiek rada, jak powinienem postępować? Czy jestem całkowicie na niewłaściwym torze?

+0

można dać przykład w świecie rzeczywistym, jak byłoby to przydatne? Czy istnieje interfejs Użytkownika przedstawiony użytkownikowi klienta, który pozwala mu wybrać metody wywoływania, być może jakiś harmonogram lub coś takiego? Co jest nie tak z tworzeniem zespołu w locie? To brzmi dość prosto. Czy wyobrażasz sobie coś prostszego niż odbicie? Mam problem z obrazowaniem tego, co by to było. – JohnOpincar

+1

To będzie używane do wywoływania usługi WF. Przepływ pracy może się zmienić - kroki można dodawać/usuwać itd. – Neil

+0

@JohnOpincar - Mój zarzut nie dotyczy refleksji - chodzi o kompilację montażu na bieżąco. Wygląda na to, że jest to podejście, które może powodować problemy z bezpieczeństwem w pewnym momencie i * może * być kruche. Wydaje mi się również dziwne, że gdy wszystkie informacje znajdują się w WSDL i że ostatecznie wszystkie połączenia będą zebrane przez coś, co wygląda jak dynamiczny interfejs API, który buduje dynamiczną warstwę z refleksją nad warstwą statyczną, która został utworzony dynamicznie, a następnie odwzorowany na warstwę dynamiczną, to trochę za dużo. Tworzenie zespołu w locie to mój plan tworzenia kopii zapasowych. – Neil

Odpowiedz

5

To prawdopodobnie nie jest odpowiedź, ale opublikuję ją jako pełną, aby w pełni opisać moją opinię.

Dynamiczny proxy:
IMO jest to przykład niewłaściwego wykorzystania technologii. Jest to elementarne zachowanie WSDL - jeśli się zmieni, musisz zmienić klienta lub musisz wykonać dobre wersje WSDL i utworzyć nowego klienta.

Nadal musisz jakoś powiedzieć klientowi, aby uzyskać WSDL - czy to znaczy, że będziesz parsował WSDL przed każdym wywołaniem? Nie wydaje się dobrym pomysłem.

Informacje o typach naprawdę nie są częścią WSDL, ponieważ domyślnie WSDL jest generowany jako interoperacyjny. Typy CLR nie są operacjami potrzebnymi do interoperacyjności. Gdy utworzysz serwer proxy usługi, dodając odniesienie do usługi lub Svcutil, wygeneruje kod dla typów zdefiniowanych w WSDL. Ten kod następnie trzeba skompilować.

Możesz spróbować użyć NetDataContractSerializer zamiast domyślnego DataContractSerializer. NetDataContractSerializer dodaje informacje typu CLR do WSDL, ale wciąż oczekuję, że nowe typy muszą być znane klientom - oznacza to wdrażanie nowego zestawu z typami i używanie go przez klientów. To brzmi prawie tak samo, gdy po prostu instaluje się zestaw z nowym statycznym proxy klienta.

Dynamiczny WF klient
ja również nie widzę zbyt dużo wykorzystanie tej architektury - trzeba jeszcze zmienić klienta, aby odzwierciedlić nowe kroki WF, prawda?

Zmiana WF
Czy mówimy o fundamencie Windows Workflow? Trudno mi sobie wyobrazić scenariusz, w którym tworzysz WF, wystawiasz go jako usługę, a następnie zmieniasz. Kiedy wystawiasz WF jako usługę, prawdopodobnie definiujesz długotrwałą WF. WF z długimi biegami używają persistance opartego na serializacji (przynajmniej w WF 3.5, ale uważam, że jest taka sama w WF 4).Gdy zmienisz definicję WF, wszystkie utrwalone WF są najprawdopodobniej skazane na zagładę, ponieważ nigdy nie będą deserializować. Ta sytuacja jest zwykle rozwiązywana przez równoległe wdrożenie nowej i starej wersji, w której stara wersja służy tylko do zakończenia niepełnych ram WF. Znów oznacza to nowych klientów.

+0

Dzięki za komentarz, jak mówisz, to nie rozwiązuje mojego problemu, ale dam go +1, ponieważ jest to prowokowanie - Zgadzam się z twoją oceną WSDL w odniesieniu do typów. Jednak gdyby WsdlImporter pozwolił mi zobaczyć, jakie typy WSDL mogłem, mógłbym dostać się tam, gdzie chcę iść. Nie potrzebuję typu CLR. Zobacz mój następny komentarz dotyczący klientów dynamicznych. – Neil

+1

Mówimy o długo działających klasach WF. Nie ma powodu, dla którego dodanie kroku do mojego przepływu pracy wymagałoby przebudowania klienta, który nie wykonuje tego kroku. Dodatkowo, jeśli chcesz zbudować szkielet do zarządzania interakcjami klientów z przepływem pracy i mieć wszystkich klientów zgodnych ze standardowym interfejsem, musisz wywołać wszystkie połączenia za pomocą węższego API niż API, które utworzy usługa WF. – Neil

+0

@Neil: W takim przypadku prawdopodobnie podążyłbym w innym kierunku. Utrzymałbym całą tę złożoność po stronie serwera. Oznacza to hostowanie WF w procesie i eksponowanie usługi sieciowej z dobrze znanym interfejsem przygotowanym na zmiany WF. Jest to pomysł wysokiego poziomu, ale powinien być możliwy i będzie łatwiejszy niż "dynamiczny klient usługi internetowej". –

1

Jeśli spojrzeć na problem pod innym kątem. Czy musisz zregenerować proxy za każdym razem, czy potrzebujesz umowy, która będzie kontynuowana, gdy coś się zmieni?

WCF posiada mechanizm tego IExtensibleDataContracts patrz: http://msdn.microsoft.com/en-us/library/ms731083%28v=VS.100%29.aspx

Najlepsze praktyki dla wersjonowanie umów można znaleźć here

+0

+1 Dziękuję za odpowiedź - może być przydatna dla innych.Niestety mamy ograniczoną kontrolę nad usługą WCF generowaną przez WF, więc nie możemy tak naprawdę podążać tą trasą. – Neil

Powiązane problemy