2011-11-27 22 views
13

Sugerencia: esta pregunta tiene muchos duplicados, pero ninguna de las soluciones funciona para mí.WCF tipos comunes no reutilizados

Lo que tengo es un servicio web y un cliente, ambos con referencias a un ensamblado compartido "DataModel". Estoy creando el proxy de servicio utilizando el cuadro de diálogo "Agregar referencia de servicio ..." y selecciono "Reutilizar tipos en todos los ensamblados a los que se hace referencia", pero aún crea nuevos tipos en lugar de reutilizar el mío.

  • solía funcionar, pero ahora de repente no es la reutilización de los tipos más
  • referencia a la asamblea compartida antes añadiendo la referencia de servicio no funciona
  • reinicio VS2010 no ayuda (tengo todas las actualizaciones)
  • me trataron con una simple clase POCO (sólo una clase simple que contiene una propiedad de entero), también sin suerte
  • Borrar y volver a agregar la referencia de servicio (o la referencia de ensamblado compartido) no ayudaron
  • Sólo seleccionar el ensamblado compartido en "Tipos de reutilización en ensamblados de referencia especificadas" - sin suerte
  • svcutil.exe /reference da el mismo resultado

estoy en el extremo del ingenio de alguna manera. ¿Hay alguna otra solución?

EDIT: Debo agregar que acabo de restablecer mi proyecto a las confirmaciones anteriores, y cualquiera que sea el compromiso que utilizo, sigue siendo el mismo problema. Y yo ¡funcionó con compromisos anteriores!

+1

También me enfrenté a este problema. El problema en mi solución fue el hecho de que una biblioteca estaba usando otra .NET Framework Version – KroaX

Respuesta

13

referencia a la asamblea compartida antes de agregar la referencia de servicio no funciona

Usted tendría que hacer esto, o al menos actualizar la referencia de servicio después de añadir la referencia.

Borrar y volver a agregar la referencia de servicio (o la referencia de ensamblado compartido) no ayudó a

y no debería tener que hacer esto, pero yo he intentado también.

Para que la 'reutilización' funcione, ambos proyectos (cliente y servicio) deben usar la misma versión del ensamblado. Está haciendo referencia al proyecto, lo cual es bueno. He encontrado esto antes al hacer referencia al ensamblado directamente debido a las diferentes versiones.

Aquí hay algunas otras cosas para tratar

  • 'Administrador de configuración' abierta para su solución - asegurarse de que el ensamblado compartido está configurado para construir.
  • Asegúrese de que está utilizando una referencia de proyecto para el cliente y servicio - utilizar el último ensamblado en el cliente no ayudará si el servicio está utilizando una versión anterior.
  • Elimine la referencia y construcción del proyecto, y espere que la compilación falle; si no falla, debe hacer referencia a otra cosa.
  • Compruebe manualmente que se haya incluido el último "ensamblado compartido" en la compilación en servicio y cliente - marque la carpeta bin, compruebe la fecha de ensamblaje/fecha de compilación.

Si falla todo lo demás, la mejor manera de forzar el mismo objeto en ambos lados es eliminar por completo el proxy de "referencia de servicio" y utilizar el método ChannelFactory. Ver Simpler Explanation of How to Make Call WCF Service without Adding Service Ref y VS2010 Advantages of Add Service Reference over direct ClientBase<>. Este es mi patrón WCF preferido porque elimina la necesidad de 'Actualizar la referencia del servicio ...' y elimina todo el código proxy generado.

+0

¡Buenas sugerencias! Comprueba todo esto y las DLL compartidas son la misma compilación tanto en el servicio como en el cliente. Por lo tanto, mi conclusión es que esta característica no es lo suficientemente confiable para mí y voy a tratar de reemplazar el proxy por la solución 'IChannelFactory '. – AndiDog

+0

@AndiDog La herramienta codegen svcutil es generalmente muy buena, pero he tenido algunos problemas con ella; una vez que use el patrón ChannelFactory verá su elegancia y probablemente nunca regrese a 'Service Reference ...' –

+2

Ahora cambié mi implementación para usar 'ChannelFactory ' con muy poco esfuerzo. Esta es realmente una buena solución si el contrato (IMyService) puede estar en un ensamblado compartido. ¡Gracias! – AndiDog

2

Es una posibilidad remota, pero una posibilidad es que una versión anterior de la DLL compartida esté en el GAC.

Intenta usar el dll compartido, encuentra un archivo DLL con los tipos que faltan y luego vuelve a crear tipos.

+0

No estoy usando el GAC en absoluto, en cambio tengo una solución con todos mis proyectos y estoy usando referencias de proyecto. – AndiDog

2

OBJETIVO OBJETIVO!

Recientemente tuvimos el mismo problema donde trabajo. Nos llevó cuatro horas buscar el problema, pero finalmente descubrimos que una enumeración de un objeto dentro del mismo dll que el objeto que rechazaba copiar tenía el mismo nombre que otra enumeración que se estaba utilizando en el servicio, por lo que se negó a reutilizar cualquier tipo de ese dll.

Sugerencia (¿solución?): Asegúrese de que no haya otros objetos en las dlls u objetos en esos objetos, o ... etc. que tengan el mismo nombre que uno en su servicio.

10

Acabo de pasar un día entero tratando de descubrir por qué los tipos en mi dll compartido no se estaban reutilizando cuando agregué una referencia de servicio en VS2013. Resulta que el servicio tuvo varios problemas relacionados con la serialización. Tenía un par de enumeraciones que no tenían el atributo EnumMember. La forma he resuelto mis problemas eran por tratar los siguientes pasos:

  1. Al comentar a cabo todas las operaciones (métodos decoradas con el atributo OperationContract) en mi ServiceContract que no devolvieron Tipos atómicas.
  2. Luego actualizando mi Referencia de servicio en mi proyecto de cliente. Me di cuenta de que el problema se había resuelto cuando en mi proyecto de cliente, pude escribir "[MyServiceReferenceName]". y mis Tipos no aparecieron en el espacio de nombres [MyServiceReferenceName]. Lo verifiqué abriendo los archivos XSD generados en el navegador de esquemas XML solo para estar seguro.
  3. Uno por uno, uncomment un método que se comentó en el Paso 1. Luego actualización de su servicio de referencia cada vez para ver si los tipos son o no están siendo resued.
  4. una vez que encuentre el método que causa que la referencia de servicio no vuelva a utilizar los tipos, vaya a cada clase para los tipos que son de entrada o salida para el método. Compruebe que todas las clases que desea serializar están decoradas con el atributo [DataContract]. Asegúrese de que todos los campos y propiedades estén decorados con el atributo [DataMember]. Además, asegúrese de que las enumeraciones estén decoradas con [DataContract] y que cada valor de enumeración esté decorado con [EnumMember].

Espero que esto ayude a otros que están pasando por este proceso frustrante y este problema no está necesariamente relacionado con un dll compartido. Mi problema no era realmente un problema con el uso de agregar o actualizar la referencia del servicio. El problema consistía en que las clases de mi entidad (modelo) no estaban decoradas con los atributos adecuados para notificar a DataContractSerializer que serializara esos tipos. Parece que si alguna parte de la serialización falla, al agregar la Referencia del servicio se agregan todos los tipos.

+1

Aquí está mi experiencia: era compartir tipos, seguro. Tenía 3 tipos: 2 clases y una enumeración donde una clase hace referencia a instancias de la otra clase y una propiedad para la enumeración. Comenté el código de servicio que agregué, luego agregué un método ficticio con '[OperationContract]' a cada uno, obtuve el servicio, verifiqué que no había una copia, luego borré ese código y comencé a comentar el código anterior. Curiosamente, eso lo solucionó. No sé por qué y, para ser sincero, me asusta un poco. –

+0

Gracias - Encontré una enumeración que había olvidado hacer un DataContract y crear EnumMembers. – mdebeus

+0

Buen consejo. Resultó que DataContract o la falta del mismo también fue mi problema. –

Cuestiones relacionadas