2010-03-06 11 views
6

Ho creato uno schema come interfaccia concordata tra la nostra azienda e una società esterna. Ora sto creando un servizio web C# WCF per gestire l'interfaccia.xsd.exe - schema per classe - per l'utilizzo con WCF

Ho eseguito l'utilità XSD e ha creato una classe C#. Lo schema è stato creato in BizTalk e fa riferimento ad altri schemi, quindi nel complesso sono state generate oltre 15 classi.

Ho messo l'attributo [DataContract} davanti a ciascuna classe. Devo mettere l'attributo [DataMember] su ogni singola proprietà?
Quando si genera un programma client di test, il proxy non ha alcun codice per nessuna di queste 15 classi.

Abbiamo usato questa tecnica quando si utilizzano i servizi .asmx, ma non siamo sicuri che funzionerà allo stesso modo con WCF. Se cambiamo lo schema, vorremmo rigenerare la classe WCF, e quindi avremmo ogni volta ridichiarlo con tutti gli attributi [DataMember]? C'è un nuovo strumento simile a XSD.exe che funzionerà meglio con WCF?

Grazie,

Neal Walters

SOLUZIONE (sepolto in una delle Saunders risposta/commento):

Aggiungere il XmlSerializerFormat alla definizione di interfaccia:

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

Two note: 1) Dopo averlo fatto, ho visto molto più .xsds nel mio proxy (Se rvice Reference) programma client di test, ma non ho visto le nuove classi nel mio intellisense. 2) Per qualche ragione, fino a quando non ho fatto una build sul progetto, non ho ottenuto tutte le classi nell'intelligence (non so perché).

risposta

4

Le classi che utilizzano [DataContract] verranno serializzate su uno schema molto limitato. Ad esempio, non ci saranno attributi, solo elementi. Questo è intenzionale, ed è fatto per le prestazioni e l'interoperabilità.

In generale, uno schema del tipo con cui si sta lavorando può essere molto più complicato. Tale schema non sarà utilizzabile con il serializzatore del contratto dati. Dovrai invece usare il Serializer XML.

In particolare, non modificare le classi create da XSD.EXE. In effetti, non dovresti mai modificare il codice generato, poiché le tue modifiche verranno rimosse non appena il codice verrà generato di nuovo. Queste classi dovrebbero avere già gli attributi su di esse che saranno necessari affinché WCF lavori con loro.

Cosa succede se li usi così come sono?

+0

1) Quando ho generare un programma client di test, il proxy non ha alcun codice per una di queste 15 classi. La mia comprensione è che WCF richiede [DataContract] e [DataMember] per esporre correttamente. Tutti gli elementi vanno bene con me. 2) Sono assolutamente d'accordo sul fatto di non voler cambiare il codice, ecco perché ho postato la domanda. 3) Cosa devo cercare per saperne di più su XmlSerializer? Genera codice C# dai file .xsd? Potrei averlo usato all'ultimo client, ma devo accedere al mio gmail (bloccato qui). – NealWalters

+2

Utilizzare [XmlSerializerFormat] in ogni operazione di servizio Web che richiede la serializzazione XML. L'utilità XSD ha già fatto tutto il resto per te. –

+0

@Downvoter: motivo del downvote? –

5

Neal, oltre a tutte le opzioni che John ti ha dato, dovresti anche controllare il WCSF.strumento di blu su CodePlex: http://wscfblue.codeplex.com/

Si tratta di un approccio di "primo contratto" per fare WCF, e una delle molte opzioni che offre è quello di creare un file di WCF DataContract dal XSD:

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

Questo poi si apre una finestra di dialogo in cui è possibile impostare un gran numero di parametri su come creare il file di C# classe dalla XSD:

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

molto utile, anche se vuoi usarlo per nient'altro che convertire le classi XSD in C# che funzionano come WCF DataContracts :-)

Vedi anche questo blog post per ulteriori spiegazioni sul processo di generazione XSD DataContract.

+0

Grazie, scarica ora ... – NealWalters

+0

Domande postate nella loro discussione su CodePlex qui: http://wscfblue.codeplex.com/Thread/View.aspx?ThreadId=204204 - come lavorare con un XSD che è stato creato con BizTalk 2006/R2 in VS2005. – NealWalters

+0

Si prega di commentare o confermare sulla mia nuova risposta. – NealWalters

3

Sono scioccato che nessuno mi ha segnalato questa utilità, che a mio avviso è quello che mi è stato chiesto di:

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

non l'ho ancora provato, ma sembra che fosse XsdDataContractImporter quello che stavo cercando, o SVCUTIL con il flag/dataContractOnly.

Ho imparato questo quando intervisto un candidato ieri. Ha detto che la serializzazione di DataContract è più veloce e sarebbe preferibile l'uso.

Neal

1

Re: la classe XsdDataContract menzionato nel tuo followup, IMO, Questa è una classe di nicchia (come è ServiceContractGenerator ecc) e quindi non sono sorpreso nessuno ti indicò. Hai ancora bisogno di comprimerlo per renderlo davvero utile. Sono abbastanza sicuro che l'esempio di codice copre solo casi d'uso molto basilari, quindi mi aspetterei di fare un sacco di lavoro con quello per farlo funzionare correttamente. . E come menzionato nel forum WSCF, Svcutil, wscf, xsd.exe e altri usano tutti questa classe e le relative classi nel processo del codice gen.

riguarda l'andamento serializzatore, ci sono davvero buoni messaggi su blog di Youssef Moussaoui sui diversi serializzatori e le loro prestazioni in particolare http://blogs.msdn.com/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx

C'è anche una buona discussione qui su Connect per quanto riguarda i due serializzatori (XS e DCS) e un punto utile che XS è ancora la via da seguire per WSDL/XSD Primo sviluppo dato che il DCS ha il solo scopo di supportare un modello di programmazione semplificato e quindi non supporta vari costrutti xml. http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=451277

Spero che questo aiuti, Cheers, Benjy

+0

Grazie, abbiamo discusso diversi giorni la scorsa settimana contro i vantaggi di DataContract contro XmlSerializer. Il nostro nuovo esperto di WCF sembra pensare che l'uso di XmlSerializer non sfrutti appieno le funzionalità di WCF. Pensi che sia vero? Sono diretto a leggere i blog che hai menzionato ora. – NealWalters

Problemi correlati