2010-03-06 17 views
6

He creado un esquema como una interfaz acordada entre nuestra empresa y una empresa externa. Ahora estoy creando un servicio web WCF C# para manejar la interfaz.xsd.exe - esquema a clase - para uso con WCF

Ejecuté la utilidad XSD y creó una clase C#. El esquema se creó en BizTalk y hace referencia a otros esquemas, por lo que se generaron más de 15 clases.

Puse el atributo [DataContract} al frente de cada una de las clases. ¿Tengo que poner el atributo [DataMember] en cada propiedad individual?
Cuando genero un programa cliente de prueba, el proxy no tiene ningún código para ninguna de estas 15 clases.

Solíamos usar esta técnica cuando usamos servicios .asmx, pero no estamos seguros si funcionará igual con WCF. Si cambiamos el esquema, nos gustaría regenerar la clase WCF, y luego tendríamos que volver a redecorarlo con todos los atributos [DataMember]? ¿Hay alguna herramienta más nueva similar a XSD.exe que funcione mejor con WCF?

Gracias,

Neal Walters

SOLUCIÓN (enterrado en una de respuesta Saunders/comentarios):

Añadir la XmlSerializerFormat a la definición de interfaz:

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

Dos notas: 1) Después de hacer esto, vi mucho más .xsds en mi proxy (Se rvice Reference) prueba el programa del cliente, pero no vi las nuevas clases en mi intellisense. 2) Por alguna razón, hasta que construí el proyecto, no obtuve todas las clases en intellisense (no estoy seguro de por qué).

Respuesta

4

Las clases que usan [DataContract] se serializarán en un esquema muy limitado. Por ejemplo, no habrá atributos, solo elementos. Esto es intencional, y se hace para el rendimiento y la interoperabilidad.

En general, un esquema del tipo con el que puede estar trabajando puede ser mucho más complicado. Tal esquema no será utilizable con el Serializador de Contrato de Datos. Necesitarás usar el Serializador XML en su lugar.

En particular, no edite las clases creadas por XSD.EXE. De hecho, nunca debe editar el código generado, ya que sus ediciones se eliminarán tan pronto como se genere el código nuevamente. Estas clases ya deberían tener los atributos que se necesitarán para que WCF trabaje con ellos.

¿Qué sucede si las usa tal como están?

+0

1) Cuando se genero un programa cliente de prueba, el proxy no tiene ningún código para cualquiera de estas 15 clases. Tengo entendido que WCF requiere que [DataContract] y [DataMember] expongan correctamente. Todos los elementos están bien conmigo. 2) Estoy totalmente de acuerdo con que no quiero cambiar el código, por eso publiqué la pregunta. 3) ¿Qué debo buscar para obtener más información sobre XmlSerializer? ¿Genera código C# a partir de archivos .xsd? Puede que lo haya utilizado por última vez, pero necesito acceder a mi gmail (bloqueado aquí). – NealWalters

+2

Utilice [XmlSerializerFormat] en cada operación del servicio web que requiera Serialización XML. La utilidad XSD ya ha hecho todo el trabajo por usted. –

+0

@Downvoter: ¿razón para el voto a favor? –

5

Neal, además de todas las opciones que John le ha dado, también debe consultar el WCSF.herramienta de azul en CodePlex: http://wscfblue.codeplex.com/

Es un enfoque "primer contrato" para hacer WCF, y una de las muchas opciones que ofrece es crear un archivo de WCF DataContract de su XSD:

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

Este a continuación, lanza un diálogo en el que se puede establecer una serie de parámetros sobre cómo crear el archivo de clase C# desde el XSD:

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

bastante útil, incluso si desea usarlo para nada más que convertir XSD en clases C# que funcionan como datos de WCF :-)

Consulte también este blog post para obtener más explicaciones sobre el proceso de generación de XSD DataContract.

+0

Gracias, descargando ahora ... – NealWalters

+0

Preguntas publicadas en su discusión CodePlex aquí: http://wscfblue.codeplex.com/Thread/View.aspx?ThreadId=204204 - cómo trabajar con un XSD que se creó con BizTalk 2006/R2 en VS2005. – NealWalters

+0

Por favor comente o confirme en mi nueva respuesta. – NealWalters

3

Me sorprende que nadie me señaló a esta utilidad, que creo que es lo que le pedía:

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

no he probado todavía, pero parece que fue XsdDataContractImporter lo que estaba buscando, o el SVCUTIL con el indicador/dataContractOnly.

Lo aprendí al entrevistar a un candidato ayer. Ella dijo que la serialización de DataContract es más rápida y preferible de usar.

Neal

1

Re: tu clase XsdDataContract mencionado en su seguimiento, la OMI, esta es una clase de nicho (tal como se ServiceContractGenerator etc), así que no me sorprende que nadie se señaló. Aún necesita empaquetarlo para que sea realmente útil. Estoy bastante seguro de que la muestra del código solo cubre casos de uso muy básicos, por lo que espero trabajar mucho para que funcione correctamente. . Y como mencioné en el foro de WSCF, Svcutil, wscf, xsd.exe y otros usan esta clase y las clases relacionadas en el proceso de código genético.

refiere al rendimiento de serializador, hay muy buenos puestos en el blog de Youssef Moussaoui en los diferentes serializadores y su rendimiento, especialmente http://blogs.msdn.com/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx

También hay una muy buena discusión aquí en Conectar con respecto a los dos serializadores (XS y DCS) y un punto útil de que XS todavía es el camino a seguir para WSDL/XSD Primer desarrollo, ya que el DCS solo tiene la intención de soportar un modelo de programación simplificado y, por lo tanto, no es compatible con varias construcciones xml. http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=451277

Espero que esto ayude, Cheers, Benjy

+0

Gracias, hemos estado debatiendo varios días la semana pasada las ventajas de DataContract frente a XmlSerializer. Nuestro nuevo experto en WCF parece pensar que el uso de XmlSerializer no aprovecha al máximo las características de WCF. ¿Crees que eso es verdad? Me dirijo a leer los blogs que mencionaste ahora. – NealWalters

Cuestiones relacionadas