2010-07-26 8 views
6

Scenario:Aggiunta WCF Service Reference non genera il codice

  • progetto di sito Web in .NET 3.5
  • Visual Studio 2010
  • servizio WCF riferimento

Problema:
Sto provando ad estendere una classe contrassegnata con l'attributo DataContract. Ho pensato che la classe generata fosse dichiarata partial, in modo da poterla facilmente estendere. Ho provato a dichiarare una classe parziale all'interno dello stesso spazio dei nomi con lo stesso nome, ma non sembra riconoscere quale classe stia estendendo. Ho provato a localizzare il file di codice generato (Reference.cs) che pensavo esistesse dopo aver letto questo article all'interno della cartella di riferimento, ma non c'era. Quando provo a navigare verso la definizione della classe, ho scoperto che era in una libreria compilata, e il problema più grande è che non è stato dichiarato come parziale.
Domanda:
Questa differenza è legata al fatto che sto utilizzando un sito Web e non un progetto Web? Se è così, c'è un modo per far sì che il generatore di codice (che sembra anche compilare il codice generato) dichiari la classe come parziale?

risposta

3

Sì, esiste un modo per dichiarare le classi DataContract come parziali.

Per questo si desidera utilizzare il DTO pattern. Fondamentalmente ciò significa definire classi "condivise" in un diverso assembly e avere sia il Servizio che l'App che consuma il Servizio, entrambi fanno riferimento all'assieme con le classi comuni.

Quindi, ad esempio, l'assembly "DTO" potrebbe contenere un DTO denominato "Prodotto". Ok, quindi li rendi Parziale, e successivamente decidi Prodotto, e quale altro Classico con gli attributi WCF, come DataContract e DataMember, ecc.

Ora fai riferimento all'assembly DTO con il tuo progetto di servizio, e al tuo Web Progetto.

Ora, quando si accede al progetto Web e si fa clic su "Aggiungi riferimento servizio", fare clic su "Avanzate" e si noterà che è possibile abilitare un'opzione per "riutilizzare gli assiemi di riferimento". fallo e avrai il pieno controllo su di te DataContracts.

+0

Grazie, provando questo ora. – scripni

+0

cool, come è andata? – andy

+0

Funziona ma non nel mio caso, uno dei motivi per cui avevo bisogno di tutta la logica di business separata dal livello di presentazione era che la logica di business funziona sotto .NET 4.0, mentre il sito web gira sotto .NET 3.5. Quindi non posso avere un riferimento che funzioni sia per il livello di servizio che per il livello di presentazione (credo). Grazie per la soluzione, tuttavia, sarà utile conoscere altri progetti. – scripni

0

Le classi di proxy di riferimento client vuote possono effettivamente essere un problema molto frustrante da risolvere.

Si consiglia di utilizzareo riga di comando svcutil.exe. contro il servizio: è possibile ottenere spesso una descrizione di errore molto più dettagliata con questi strumenti rispetto alla procedura guidata di riferimento del servizio Visual Studio.

Nel mio caso i problemi sono sempre legati alla serializzazione o namespacing problemi del soggetto/grafico - tipicamente non corrispondenti get e set su DataMember proprietà, manca KnownType sulle entità polimorfiche, o riferimenti circolari nel grafico.

Parziale non dovrebbe essere un problema. Assicurati che eventuali proprietà aggiuntive che desideri serializzare siano contrassegnate come DataMember.

Se tutto il resto fallisce, si consiglia di eseguire un test di serializzazione/deserializzazione contro il proprio grafico entità/entità.

Problemi correlati