Użyłem narzędzia xsd.exe do wygenerowania klasy danych, ale wcf nie lubi wymiany klasy danych i zgłasza błąd

"Wystąpił błąd podczas próby serializacji parametru http://tempuri.org/:orderItems. Komunikat InnerException to „Typ „Store.Schemas.Order” z nazwą kontraktu danych „Order:http://schemas.datacontract.org/2004/07/Store.Schemas”. lista znanych typów — na przykład przy użyciu atrybutu KnownTypeAttribute lub przez dodanie ich do listy znanych typów przekazanych do DataContractSerializer.". Zobacz InnerException, aby uzyskać więcej informacji.

Istnieje wiele klas opartych na XSD. Zgodnie z MSDN , jest napisane http://msdn.microsoft.com/en-us /library/ms751512.aspx, wszystkie klasy danych, które mają być ozdobione KnownTypeAttribute,DataContractAttribute, DataMemberAttribute itp.

Czy istnieje sposób, w jaki mogę wygenerować klasę danych z xsd, która może być używana z usługą WCF? ponieważ zmiana klasy generowanej przez XSD.exe nie jest zalecana ani łatwa.

1
DotNetDeveloper 6 czerwiec 2011, 19:17

3 odpowiedzi

Najlepsza odpowiedź

http://wscfblue.codeplex.com/ generator open source rozwiązał problem

0
DotNetDeveloper 13 czerwiec 2011, 19:22

Myślę, że pierwszym pytaniem jest to, czy masz również wsdl, który odnosi się do xsd. jeśli tak, możesz użyć scvutil.exe i przekazać ścieżkę wsdl i upewnić się, że pliki xsd również znajdują się w tym samym katalogu, co plik wsdl. to wygeneruje dla Ciebie wymagane klasy danych.

HTH

0
rauts 6 czerwiec 2011, 20:16
Czy możesz wkleić przykładową składnię?
 – 
DotNetDeveloper
6 czerwiec 2011, 20:40
"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\svcutil.exe" /t:kod *.wsdl *.xsd /język:C#
 – 
rauts
7 czerwiec 2011, 14:08
WSDL można uzyskać, dołączając ?wsdl do adresu URL usługi (svc). kiedy to zdobędziesz, zapisz kopię tego w tej samej lokalizacji, co twoje pliki xsd. następnie przejdź do Visual Studio i dodaj odwołanie do usługi i podaj ścieżkę do pliku WSDL w adresie URL usługi. jeśli xsd pasuje do WSDL, powinieneś wygenerować ur klasy danych.
 – 
rauts
7 czerwiec 2011, 14:11

Jeśli chcesz generować klasy za pomocą XSD.exe, otrzymasz serializowalny typ danych XML oznaczony wszystkimi tymi atrybutami Xml, które kontrolują jego serializację przez XmlSerializer. Wcf domyślnie używa DataContractSerializer, który nie używa atrybutów używanych do opisywania serializacji. Musisz przełączyć się na XmlSerializer, używając atrybutu XmlSerializerFormat w swojej usłudze, operacji lub umowie serwisowej.

0
Ladislav Mrnka 6 czerwiec 2011, 20:29
...Nie rozumiem, co masz na myśli przez wsdl? Mam usługę działającą w usługach IIS. Czy możesz skopiować przykładową składnię dla SVCutil.exe, która pobiera plik xsd oraz adres URL usługi
 – 
DotNetDeveloper
6 czerwiec 2011, 20:33
Mrnka.... Próbowałem zawinąć interfejs za pomocą [ServiceContract, XmlSerializerFormat(Style = OperationFormatStyle.Rpc, Use = OperationFormatUse.Encoded)] i nie zadziałało i nadal narzeka na niektóre klasy w pliku xsd
 – 
DotNetDeveloper
6 czerwiec 2011, 20:34
Mrnka ... Właśnie dostałem xsd od klienta, który używał serilaizera xml i działa, jeśli generuję klasy danych i używam XmlSerializer deserlizer = new XmlSerializer(typeof()); ale tylko w serwisie to nie działa
 – 
DotNetDeveloper
7 czerwiec 2011, 00:38
Ale nie tak działają usługi. Wywołanie usługi XSD nie wystarczy. Potrzebujesz WSDL, który opisuje działanie usługi. Pliki XSD są przywoływane tylko z WSDL.
 – 
Ladislav Mrnka
7 czerwiec 2011, 01:05
Mrnka mam usługę wsdl i umowę o świadczenie usług wszystko. Klasa danych używana jako parametr w jednej z operacji jest nieaktywna, ponieważ klasa danych jest generowana przez XSD.exe, który nie zawiera atrybutów datacontract ani elementów członkowskich danych
 – 
DotNetDeveloper
7 czerwiec 2011, 17:45