2010-07-26 11 views
6

Escenario:Adición de WCF referencia de servicio no genera código

  • proyecto de sitio web en .NET 3,5
  • Visual Studio referencia 2010
  • servicio WCF

Problema:
Estoy tratando de extender una clase marcada con el atributo DataContract. Pensé que la clase generada fue declarada partial, por lo que podría extenderla fácilmente. Traté de declarar una clase parcial dentro del mismo espacio de nombres con el mismo nombre, pero no parece reconocer qué clase se está extendiendo. Intenté localizar el archivo de código generado (Reference.cs) que creí que existía después de leer este article dentro de la carpeta de referencia, pero no estaba allí. Al intentar navegar a la definición de la clase, descubrí que estaba en una biblioteca compilada, y el mayor problema es que no se declaró como parcial.
Pregunta:
¿Esta diferencia está relacionada con el hecho de que estoy usando un sitio web y no un proyecto web? En caso afirmativo, ¿hay alguna manera de hacer que el generador de código (que también parece compilar el código generado) declare la clase como parcial?

Respuesta

3

Sí, hay una manera en que puede declarar sus clases de DataContract como parciales.

Para esto, querrá usar el DTO pattern. Básicamente esto significa definir Clases "compartidas" en un ensamblaje diferente, y tener el Servicio y la Aplicación que consume el Servicio, ambos hacen referencia al ensamblado con sus clases comunes.

Así que, por ejemplo, su ensamblaje "DTOs" podría contener un DTO llamado "Producto". Ok, entonces los convierte en Partial, y luego decora Product, y cualquier otra clase con los atributos de WCF, como DataContract y DataMember, etc.

Ahora, usted hace referencia al ensamblado de DTO con su proyecto de Servicio, y su Web Proyecto.

Ahora, cuando vaya a su proyecto web y haga clic en "Agregar referencia de servicio", haga clic en "Avanzado", y verá que puede habilitar una opción para "reutilizar ensambles referenciados". hazlo y tendrás control total sobre tus DataContracts.

+0

Gracias, intentando esto ahora. – scripni

+0

genial, ¿cómo te fue? – andy

+0

Funciona, pero no en mi caso, una de las razones por las que necesitaba toda la lógica de negocios separada de la capa de presentación era que la lógica de negocios se ejecuta bajo .NET 4.0, mientras que el sitio web se ejecuta bajo .NET 3.5. Entonces no puedo tener una referencia que funcione tanto para la capa de servicio como para la capa de presentación (creo). Gracias por la solución, será útil conocer otros proyectos. – scripni

0

Las clases de proxy de referencia de cliente vacías pueden ser un problema muy frustrante de resolver.

Yo recomendaría que utiliza la línea de comandos o WCF Test Clientsvcutil.exe. contra el servicio - a menudo se puede obtener una descripción mucho más detallada de error con estas herramientas que con referencia asistente Visual Studio service.

En mi caso las cuestiones invariablemente se relaciona con cuestiones de serialización o los espacios de nombre de la entidad/gráfico - normalmente no coincidentes get y set en DataMember propiedades, falta KnownType en entidades polimórficas, o referencias circulares en el gráfico.

Parcial no debería ser un problema. Solo asegúrese de que las propiedades adicionales que desee serializar estén marcadas como DataMember.

Si todo lo demás falla, le recomendamos que ejecute una prueba de unidad de serialización/deserialización contra el gráfico de su entidad/entidad.

Cuestiones relacionadas