2010-03-06 2 views
6

Ich habe ein Schema als eine vereinbarte Schnittstelle zwischen unserer Firma und einer externen Firma erstellt. Ich erstelle jetzt einen WCF C# -Webdienst, um die Schnittstelle zu behandeln.xsd.exe - Schema zur Klasse - zur Verwendung mit WCF

Ich habe das XSD-Dienstprogramm ausgeführt und es erstellt eine C# -Klasse. Das Schema wurde in BizTalk erstellt und verweist auf andere Schemas, sodass insgesamt mehr als 15 Klassen generiert werden.

Ich legte [DataContract] Attribut vor jeder der Klassen. Muss ich das Attribut [DataMember] auf jede einzelne Eigenschaft setzen?
Wenn ich ein Test-Client-Programm erzeuge, hat der Proxy keinen Code für eine dieser 15 Klassen.

Wir verwendeten diese Technik bei der Verwendung von .asmx-Diensten, aber nicht sicher, ob es mit WCF funktioniert. Wenn wir das Schema ändern, möchten wir die WCF-Klasse neu generieren, und dann müssten wir sie jedes Mal mit allen [DataMember] -Attributen neu gestalten. Gibt es ein neueres Tool wie XSD.exe, das besser mit WCF funktioniert?

Danke,

Neal Walters

SOLUTION (begraben in einer von Saunders Antwort/Kommentare):

Fügen Sie die XmlSerializerFormat an die Schnittstellendefinition:

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

Zwei Hinweise: 1) Nachdem ich dies getan habe, sah ich viel mehr .xsds in meinem Proxy (Se Rice Referenz) Test Client-Programm, aber ich habe nicht die neuen Klassen in meinem Intellisense gesehen. 2) Aus irgendeinem Grund, bis ich ein Build auf dem Projekt gemacht habe, habe ich nicht alle Klassen in der Intellisense (nicht sicher, warum).

Antwort

4

Klassen, die [DataContract] verwenden, werden in einem sehr begrenzten Schema serialisiert. Zum Beispiel wird es keine Attribute geben, nur Elemente. Dies ist beabsichtigt und erfolgt für Leistung und Interoperabilität.

Im Allgemeinen kann ein Schema der Art, mit der Sie möglicherweise arbeiten, viel komplizierter sein. Ein solches Schema kann nicht mit dem Data Contract Serializer verwendet werden. Sie müssen stattdessen den XML-Serializer verwenden.

Bearbeiten Sie insbesondere nicht die von XSD.EXE erstellten Klassen. In der Tat sollten Sie generierten Code niemals bearbeiten, da Ihre Änderungen entfernt werden, sobald der Code erneut generiert wird. Diese Klassen sollten bereits über die Attribute verfügen, die für WCF benötigt werden, um mit ihnen zu arbeiten.

Was passiert, wenn Sie sie nur so verwenden, wie sie ist?

+0

1) Wenn ich ein Test-Client-Programm erzeugen, die Proxy keinen Code hat für jede dieser 15 Klassen. Mein Verständnis ist, dass WCF erfordert, dass [DataContract] und [DataMember] ordnungsgemäß verfügbar gemacht werden. Alle Elemente sind in Ordnung für mich. 2) Ich stimme völlig überein, den Code nicht ändern zu wollen, deshalb habe ich die Frage gestellt. 3) Was soll ich suchen, um mehr über XmlSerializer zu erfahren? Generiert es C# -Code aus .xsd-Dateien? Ich habe es vielleicht beim letzten Client benutzt, muss aber auf meine Gmail zugreifen (hier blockiert). – NealWalters

+2

Verwenden Sie [XmlSerializerFormat] für jeden Web-Service-Vorgang, für den XML-Serialisierung erforderlich ist. Das XSD-Dienstprogramm hat bereits alle anderen Arbeiten für Sie erledigt. –

+0

@Downvoter: Grund für den Downvote? –

5

Neal, neben all den Optionen, die John Ihnen gegeben hat, sollten Sie auch die WCSF überprüfen.Blau-Tool auf Codeplex: http://wscfblue.codeplex.com/

Es ist ein „Vertrag zuerst“ -Ansatz zu WCF zu tun, und eine der vielen Möglichkeiten ist es bietet eine WCF Datacontract-Datei von Ihrem XSD zu erstellen:

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

Diese dann öffnet sich ein Dialog, in dem Sie eine ganze Reihe von Parametern, wie Sie Ihre C# Klasse Datei aus dem XSD erstellen setzen:

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

Ganz nützlich, auch wenn Sie Ich möchte es nur für die Umwandlung von XSD in C# -Klassen verwenden, die als WCF DataContracts funktionieren :-)

Siehe auch blog post für weitere Erläuterungen zum XSD DataContract-Generierungsprozess.

+0

Danke, jetzt herunterladen ... – NealWalters

+0

Posted Fragen in ihrer CodePlex-Diskussion hier: http://wscfblue.codeplex.com/Thread/View.aspx?ThreadId=204204 - wie mit einer XSD arbeiten, die mit BizTalk 2006/erstellt wurde R2 in VS2005. – NealWalters

+0

Bitte kommentieren oder bestätigen Sie meine neue Antwort. – NealWalters

3

ich schockiert bin, dass mich niemand zu diesem Programm hingewiesen, die meiner Meinung nach ist das, was ich fragte nach:

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

Ich habe es noch nicht ausprobiert, aber es sieht aus wie XsdDataContractImporter war was ich gesucht habe, oder die SVCUTIL mit dem/dataContractOnly Flag.

Ich habe dies gestern bei der Befragung eines Kandidaten gelernt. Sie sagte, DataContract Serialisierung ist schneller und würde bevorzugt zu verwenden.

Neal

1

Re: Ihre XsdDataContract Klasse in Ihrer Followup erwähnt, IMO, Dies ist ein Nischenklasse (wie ServiceContractGenerator usw.), so bin ich nicht überrascht, niemand Sie darauf hingewiesen. Sie müssen es noch packen, um es wirklich nützlich zu machen. Ich bin mir ziemlich sicher, dass das Codebeispiel nur sehr einfache Anwendungsfälle abdeckt, so dass ich damit viel Arbeit machen würde, um es in einen ordnungsgemäßen Arbeitszustand zu bringen. . Und wie ich im WSCF-Forum erwähnt habe, verwenden Svcutil, wscf, xsd.exe und andere diese Klasse und verwandte Klassen im Code-Gen-Prozess.

betrachtet die Serializer Leistung, gibt es wirklich gute Beiträge über Youssef Moussaoui Blog über die verschiedenen Serializer und ihre Leistung besonders http://blogs.msdn.com/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx

Es gibt auch eine wirklich gute Diskussion hier auf Connect in Bezug auf die beiden Serializer (XS und DCS) und ein nützlicher Punkt, dass XS immer noch der Weg nach vorne für WSDL/XSD Erste Entwicklung ist, da das DCS nur ein vereinfachtes Programmiermodell unterstützen soll und daher verschiedene xml-Konstrukte nicht unterstützt. http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=451277

hoffte, das hilft, Cheers, Benjy

+0

Danke, wir haben letzte Woche einige Tage über die Vorteile von DataContract vs XmlSerializer debattiert. Unser neuer WCF-Experte scheint zu glauben, dass die Verwendung von XmlSerializer die WCF-Funktionen nicht voll ausnutzt. Glaubst du das ist wahr? Ich bin auf dem Weg, die Blogs zu lesen, die du jetzt erwähnt hast. – NealWalters