2010-02-24 23 views
19

Estoy creando un conjunto de servicios WCF que comparten contratos de datos comunes (o entidades, si lo prefiere). Estos son objetos simples de transferencia de datos que están decorados con atributos DataContract y DataMember. Estoy especificando el nombre y el espacio de nombres. Al tratar de seguir los principios de la recomendación de IDesign de promediar 12 miembros por contrato de servicio, estoy dividiendo mi proyecto de servicio en múltiples servicios.Múltiples servicios WCF que hacen referencia a los mismos contratos de datos

Mis contratos de datos se encuentran en un conjunto separado que puedo proporcionar a nuestros clientes si están usando .Net. Pueden indicar su referencia de servicio a los tipos de reutilización en los ensamblados a los que se hace referencia. Sin embargo, si no están usando .net y usan 2 servicios que usan la misma entidad, supongo que obtendrán un mensaje de referencia ambiguo. Puedo ver esto en Visual Studio si no hago referencia al dll de contrato de datos.

Mi pregunta es, ¿hay algo que pueda hacer en mis servicios, o que puedan hacer en una aplicación cliente para evitar tener que calificar de qué proxy proviene el contrato de datos?

+0

Estoy teniendo el mismo problema. Intenté usar el consejo en el artículo siguiente, pero no me gustó. Sin embargo, estoy usando los servicios RESTful de WCF (esto podría tener algo que ver con el siguiente método que no funciona), así que terminé simplemente haciendo referencia a una DLL común que contenía mis contratos de datos, y omitiendo todas las referencias de servicio. Dado que llamo a mis servicios utilizando simples solicitudes web HTTP, en realidad no necesito las referencias de servicio en el proyecto. – Nick

Respuesta

2

También tiendo a mantener todos mis contratos de datos en un ensamblaje al que hacen referencia múltiples servicios y numerosas aplicaciones cliente, que funciona muy bien pero nunca he intentado consumir el servicio fuera de .NET.

¿Podría ser útil saber qué tecnología están utilizando para consumir el servicio que no sea .NET? ¿Qué está arrojando el ambiguo mensaje de referencia?

+0

Puede hacerlo en .net, simplemente no haga referencia a su dll de contrato de datos y observe lo que sucede. Cree un proyecto de prueba, agregue 2 de sus servicios que utilicen un contrato de datos común como referencias y obtendrá el mensaje ambiguo. –

0

Tengo varios servicios que comparten objetos en mi extremo. No estoy seguro de por qué estás teniendo este problema. En mi caso, puedo acceder a los objetos de esta manera. . . .

cliente SERVICE1 = new SERVICE1()

client.CommonLibrary.Address. . .

service2 client2 = new service2()

client2.CommonLibrary.Address. . . .

+0

Eso también funciona para mí. El punto es que son 2 objetos diferentes. La aplicación consumidora no puede simplemente decir CommonLibrary.Address, debe estar calificada con el nombre del servicio. Esto no es realmente un problema, solo me preguntaba si las referencias de servicio detectarían el mismo espacio de nombres para los contratos de datos comunes y lo compartirían. –

0

Desde mi entender y trabajar con WCF, ya sea uno de los contrato de datos utilizado por la aplicación cliente no importa siempre y cuando el nombre completo es el mismo y tiene los mismos miembros de datos. Internamente, solo crea el objeto dinámicamente y reasigna esas propiedades de miembro de datos usando el setter público.

Un mejor enfoque Creo que es para refactorizar su contrato de datos para que ponga todo en común en más de un servicio en un ensamble y se refiera a ellos, por lo tanto no tendrá problemas ambiguos o conflictivos, independientemente de cuántos servicios sean utilizado por la aplicación del cliente.

+0

Fadrian, todos mis contratos de datos están en un ensamblaje. El problema es si 2 servicios hacen referencia al mismo contrato de datos, cada servicio obtiene su propia versión del espacio de nombres. –

+0

Paul, ¿has intentado especificar explícitamente el espacio de nombres en el atributo DataContract? y cómo creaste el ensamblado de contrato de datos? ¿Intentó usar la herramienta svcutil y generar manualmente el control de datos con/namespace: parameter? Yo personalmente no he tenido ese problema así que es posible que no apriete el botón derecho, solo compartiendo algunos pensamientos aquí. –

0

Generamos nuestros proxies de servicio no a través del asistente de Visual Studio sino mediante archivos por lotes personalizados que llaman a slsvcutil.exe (como usamos Silverlight).No se puede especificar una asignación de espacio de nombres utilizando el parámetro/n de esta manera:

"C:\Program Files (x86)\Microsoft SDKs\Silverlight\v5.0\tools\slsvcutil.exe "^ 
http://ServiceUrl/MyService.svc^ 
**/n:http://youruri.org/CustomerService/DataContracts,CLR.Namespace.CustomerService^** 
/n:*,CLR.Namepsace.MyService^ 
/r:"%ProgramFilesFolder%\Reference Assemblies\Microsoft\Framework\Silverlight\v5.0\System.Windows.dll"^ 
/ct:System.Collections.ObjectModel.ObservableCollection`1^ 
/edb^ 

Así que todos los contratos de datos con el espacio de nombres http://youruri.org/CustomerService/DataContracts se generan a la CLR.Namespace.CustomerService CLR espacio de nombres en el archivo de proxy y así sucesivamente. Dado que ha generado este proxy por adelantado en el mismo ensamblado de proxy, puede cortar todo el espacio de nombres de su segundo archivo y todo funciona bien: escribimos una pequeña herramienta para el último paso. Todos los demás espacios de nombres de contrato se generarán en CLR.Namepsace.MyService namspace (vea el asterisco que significa "capturar todo")

El proceso requiere cierta preparación, ya que debe crear manualmente los archivos por lotes, pero una vez hecho esto funciona bien.

Cuestiones relacionadas