2009-07-22 8 views
16

Zasadniczo, mam typ "Foo" po stronie serwera z członkami X i Y. Ilekroć używam "Add Server Reference" Visual Studio, wtedy widzę WSDL i wygenerowany serwer proxy oba dołączają słowo "Field" do wszystkich członków i zmienić obudowę pierwszej litery. IE, "X" i "Y" są przemianowane na "xField" i "yField". Jakiś pomysł dlaczego tak się dzieje? Nie mogę wymyślić wzoru.Dlaczego WCF czasami dodaje "Pole" do końca generowanych typów proxy?

Szczegóły - Mam starszą usługę sieci ASMX, która udostępnia typ "Foo". Stworzyłem nową usługę WCF, która jest opakowaniem starej usługi sieciowej - nowa usługa po prostu opakowuje te metody i może aktualizuje wartości kilku pól, ale eksponuje dokładnie te same metody i zwraca dokładnie te same typy. Próbowałem wielokrotnie odtwarzać sędziów, a za każdym razem zawsze zmieniam moje pola: zmienna "STUFF" jest widoczna w pliku wsdl i proxy jako "sTUFFField". Zmienna "X" jest widoczna jako "xField", itp.

Zabawne jest to, że nie mogę wymyślić wzoru - próbowałem stworzyć nową usługę sieciową ASMX jako test i opakowanie - zmienne nie są zmienione następnie. Tak więc nie mogę znaleźć schematu dlaczego/kiedy WCF zmienia nazwy zmiennych.

Ktoś wie?

+0

Czy to ma znaczenie? Jeśli tak, to czy to ma znaczenie? –

+2

To ma znaczenie. Mam dwa przypadki użycia (dla użytkowników wewnętrznych i zewnętrznych). Użytkownicy wewnętrzni mogą ominąć moją usługę opakowania i przejść bezpośrednio do podstawowej usługi (pomijając potrzebę zalogowania się). Zewnętrzni użytkownicy muszą przejść przez usługę opakowania i podać jej hasło itp. Ale ponieważ usługi wewnętrzne i zewnętrzne podają obecnie różne nazwy pól, nie mogę udostępnić tego samego kodu, aby rozmawiać z obiema usługami. Muszę napisać różne wersje kodu dla każdej usługi. – tavistmorph

Odpowiedz

3

Zazwyczaj generowane proxy będzie miało "XField" i "YField" jako pola wewnętrzne/chronione/prywatne i ujawni wartości poprzez właściwości o nazwach "X" i "Y". Istnieją opcje, które możesz ustawić podczas tworzenia klienta proxy, aby dostosować go do własnych potrzeb, jak sądzę.

AKTUALIZACJA: Nie widzę żadnych przełączników ani opcji kontrolujących to zachowanie. To może zależeć od tego, który serializator (DataContractSerializer vs. XmlSerializer) WCF używa do tworzenia proxy klienta.

W końcu jest to mniej więcej kwestia stylu kodowania - funkcjonalnie nie powinno to mieć znaczenia.

Marc

+0

Właśnie tak działa NORMALNY, ale widzę, że zmieniono nazwy pól publicznych. Tak więc wewnętrzne pola są nazywane "XFieldField", a publiczny accessor nazywa się "XField". Nie tego, czego chcę, a to oznacza, że ​​interfejs do usługi opakowania staje się inny niż interfejs do faktycznej usługi. Więc nie mogę już traktować tych dwóch usług w sposób wymienny. – tavistmorph

+0

To dziwne i nieoczekiwane - jak utworzyć serwer proxy klienta? W programie Visual Studio lub przy użyciu programu svcutil.exe? –

+0

Dokładnie - dziwne i nieoczekiwane. Dzieje się tak tylko w tym jednym projekcie, więc nie mogę wymyślić tego schematu. Ale utworzyłem proxy klienta w Visual Studio, po prostu klikając "Dodaj referencję do usługi". – tavistmorph

4

miałem ten sam problem, ale udało mi się znaleźć rozwiązanie.

W interfejsie, jeśli dodasz znacznik [DataContractFormat], otrzymasz wynik "XFieldField". Ale jeśli zastąpisz go [XmlSerializerFormat] w interfejsie, nie zmieni to nazw w generowanym proxy.

19

Miałem ten sam problem, a odpowiedź sergiosp doprowadziła mnie w dobrym kierunku. Po prostu dodam dodatkowe informacje, aby pomóc komuś innemu.

Dodanie [System.ServiceModel.XmlSerializerFormatAttribute()] do interfejsu i ponowne wygenerowanie kodu klienta rozwiązało problem dla mnie.

public interface IMyService 
{ 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [System.ServiceModel.OperationContract] 
    recordResponse GetRecord(recordRequest request); 

} 
+0

dzięki za pomoc. Rozwiązanie również dla mnie, ale czy masz pojęcie, co robi ten kod i jak rozwiązuje problem? – batmaci

+1

@batmaci Po dodaniu odwołania do usługi w Visual Studio, funkcja WCF generuje kod klienta, aby wywołać usługę. Będzie używać domyślnie DataContractSerializer. Dodanie XmlSerializerFormatAttribute powoduje, że WCF generuje kod za pomocą XmlSerializer. Spróbuj dodać odwołanie do usługi raz za pomocą XmlSerializerFormatAttribute i raz bez, i porównaj różnice w wygenerowanym pliku kodu (Reference.cs). – tgriffin

+0

Nie mogę uwierzyć, że ta odpowiedź była tutaj od 2 lat. Szukałem tej odpowiedzi szaleńczo przez SO i Internet. Jest to dosłownie odpowiedź na moją modlitwę. W przypadku, gdy przyda ci się wam ludzie przyszłości, którzy napotykają na ten sam problem, [tutaj] (http://stackoverflow.com/a/20713299/2453110) jest linkiem do mojego podobnego pytania na temat budowania odbiornika zdarzeń DocuSign dla ich usługi powiadamiania Connect. –

0

miałem ten problem też, ale od klienta ja wciąż coraz Field na koniec członków klasy nawet po dokonaniu powyższej zmiany w interfejsie.

Problem polegał na tym, że używałem DataContractSerializer do pracy z żądaniami serializowanymi plików na dysku (podczas testu naszej usługi otrzymywaliśmy od dostawcy szeregowe żądania, aby móc debugować przed uruchomieniem).

Po zmianie DataContractSerializer do XmlSerializer, podając na jej konstruktora element główny (przez typeof() rozmowy) i rootnamespace (bo domyślnie XmlSerializers napisać standardowej przestrzeni nazw), mogę deserializowania żądań i doskonale współpracować z Usługa WCF.

Mam nadzieję, że to pomoże komuś. Straciłem tak wiele czasu z tym "problemem".

Powiązane problemy