2010-03-06 15 views
6

Stworzyłem schemat jako uzgodniony interfejs między naszą firmą a zewnętrzną firmą. Teraz tworzę usługę WWW WCF C# do obsługi interfejsu.xsd.exe - schemat do klasy - do użytku z WCF

Uruchomiłem narzędzie XSD i utworzyłem klasę C#. Schemat został zbudowany w BizTalk i odwołuje się do innych schematów, więc generuje się ponad 15 klas.

Umieszczam atrybut [DataContract} przed każdą z klas. Czy muszę umieścić atrybut [DataMember] na każdej nieruchomości?
Kiedy generuję program klienta testowego, proxy nie ma żadnego kodu dla żadnej z tych 15 klas.

Używaliśmy tej techniki podczas korzystania z usług .asmx, ale nie jesteśmy pewni, czy będzie działać tak samo z WCF. Jeśli zmienimy schemat, chcielibyśmy zregenerować klasę WCF, a następnie będziemy musieli za każdym razem redefiniować ją przy pomocy wszystkich atrybutów [DataMember]? Czy istnieje nowsze narzędzie podobne do XSD.exe, które będzie działało lepiej z WCF?

Dzięki

Neal Walters

ROZWIĄZANIE (pochowany w jednym z Saunders odpowiedzi/komentarze):

Dodaj XmlSerializerFormat definicji interfejsu:

[OperationContract] 
    [XmlSerializerFormat]  // ADD THIS LINE 
    Transaction SubmitTransaction(Transaction transactionIn); 

Two Notatki: 1) Po tym zrobiłem, widziałem dużo więcej .xsds w moim proxy (Se rvice Reference) program klienta testowego, ale nie widziałem nowych klas w mojej intellisense. 2) Z jakiegoś powodu, dopóki nie zrobiłem kompilacji na projekcie, nie dostałem wszystkich klas w intellisense (nie wiem dlaczego).

Odpowiedz

4

Klasy, które używają [DataContract] będą przekształcane do bardzo ograniczonego schematu. Na przykład nie będzie żadnych atrybutów, tylko elementy. Jest to zamierzone działanie, które ma na celu zapewnienie wydajności i interoperacyjności.

Ogólnie rzecz biorąc, schemat, z którym można pracować, może być znacznie bardziej skomplikowany. Taki schemat nie będzie dostępny z Serializerem kontraktów danych. Będziesz musiał zamiast tego użyć Serializera XML.

W szczególności nie edytuj klas utworzonych przez XSD.EXE. W rzeczywistości nigdy nie powinieneś edytować wygenerowanego kodu, ponieważ twoje zmiany zostaną usunięte zaraz po ponownym wygenerowaniu kodu. Te klasy powinny już mieć atrybuty na nich, które będą potrzebne, aby WCF mógł z nimi pracować.

Co się stanie, jeśli po prostu użyjesz ich tak jak jest?

+0

1) Kiedy wygenerować program kliencki testy, pełnomocnik nie posiada żadnego kodu dla każdego z tych 15 klas. Rozumiem, że WCF wymaga, aby [DataContract] i [DataMember] były odpowiednio eksponowane. Wszystkie elementy są ze mną w porządku. 2) Całkowicie zgadzam się, że nie chcę zmienić kodu, dlatego wysłałem pytanie. 3) Czego należy szukać, aby dowiedzieć się więcej o XmlSerializer? Czy generuje kod C# z plików .xsd? Mogłem go używać na ostatnim kliencie, ale muszę mieć dostęp do mojego konta Gmail (tutaj zablokowane). – NealWalters

+2

Użyj [XmlSerializerFormat] w każdej operacji usługi sieci Web, która wymaga szeregowania XML. Narzędzie XSD wykonało już dla ciebie wszystkie pozostałe zadania. –

+0

@Dvvoter: powód upadku? –

5

Neal, oprócz wszystkich opcji, które dał ci John, powinieneś również sprawdzić WCSF.niebieski narzędzie na Codeplex: http://wscfblue.codeplex.com/

Jest to "umowa pierwsze" podejście do robienia WCF, a jedna z wielu opcji, jakie oferuje to, aby utworzyć plik WCF DataContract z Twojego XSD:

alt text http://i50.tinypic.com/rj1sw0.png

ten następnie pojawia się okno dialogowe, w którym można ustawić mnóstwo parametrów, w jaki sposób utworzyć C# plik klasy z XSD:

alt text http://i46.tinypic.com/315h8yh.png

bardzo przydatne, nawet jeśli chcesz go używać tylko do konwersji klas XSD na klasy C#, które działają jako Kontakty Danych WCF :-)

Zobacz także blog post, aby uzyskać więcej informacji na temat procesu generowania danych XSD DataContract.

+0

Dzięki, pobieranie teraz ... – NealWalters

+0

Opublikował pytania w ich dyskusji CodePlex tutaj: http://wscfblue.codeplex.com/Thread/View.aspx?ThreadId=204204 - jak pracować z XSD, który został stworzony z BizTalk 2006/R2 w VS2005. – NealWalters

+0

Proszę skomentuj lub potwierdź moją nową odpowiedź. – NealWalters

3

Jestem w szoku, że nikt nie zwrócił mi na to narzędzie, które moim zdaniem jest to, co zostało z prośbą o:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.xsddatacontractimporter.aspx

nie próbowałem tego jeszcze, ale wygląda na to XsdDataContractImporter było czego szukałem, lub SVCUTIL z flagą/dataContractOnly.

Nauczyłem się tego, kiedy wczoraj rozmawiałem z kandydatem. Powiedziała, że ​​serializacja danych DataContract jest szybsza i preferowana.

Neal

1

Re: klasa XsdDataContract wspomniano w swojej obserwacji, IMO, jest to klasa nisza (jak ServiceContractGenerator itp), więc nie jestem zaskoczony, nikt nie wskazał do niego. Nadal trzeba go spakować, aby był naprawdę użyteczny. Jestem całkiem pewny, że przykład kodu obejmuje tylko bardzo podstawowe przypadki użycia, więc spodziewałbym się, że wykonam z tym dużo pracy, aby uzyskać odpowiedni stan roboczy. . I jak wspomniałem na forum WSCF, Svcutil, wscf, xsd.exe i inne używają tej klasy i powiązanych klas w procesie gen kodu.

chodzi o wydajność serializer, są naprawdę dobre posty na blogu Youssef Moussaoui jest na różnych serializers i ich wydajności szczególnie http://blogs.msdn.com/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx

Jest też bardzo dobra dyskusja tutaj Połącz dotyczące dwóch serializers (XS i DCS) i przydatny punkt, że XS jest nadal drogą do przodu dla rozwoju WSDL/XSD First, ponieważ DCS jest przeznaczony tylko do obsługi uproszczonego modelu programowania, a zatem nie obsługuje różnych konstruktów XML. http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=451277

Nadzieja to pomaga, Cheers, Benjy

+0

Dzięki, debatowaliśmy kilka dni w zeszłym tygodniu o zaletach usługi DataContract vs XmlSerializer. Nasz nowy ekspert WCF wydaje się myśleć, że używanie XmlSerializer nie wykorzystuje w pełni funkcji WCF. Czy uważasz, że to prawda? Zamierzam przeczytać blogi, o których wspomniałeś. – NealWalters

Powiązane problemy