wcf service datacontract reusability

MĂșltiples servicios WCF que hacen referencia a los mismos contratos de datos



service datacontract (6)

También tiendo a mantener todos mis contratos de datos en un ensamblaje al que hacen referencia múltiples servicios y numerosas aplicaciones de clientes, que funciona muy bien, pero nunca intenté 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?

Estoy creando un conjunto de servicios de 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.

Mis contratos de datos están en un ensamble 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?


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. . . .

SERVICE1 cliente = nuevo SERVICE1 ()

client.CommonLibrary.Address. . .

SERVICE2 client2 = new SERVICE2 ()

client2.CommonLibrary.Address. . . .


Según entiendo y trabajo con WCF, ninguno de los contratos de datos utilizados por la aplicación del cliente no importaría, siempre y cuando el nombre completo sea el mismo y tenga 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.

Creo que un mejor enfoque es refactorizar su contrato de datos para que ponga todo en común en más de un servicio en un ensamblaje y se refiera a ellos, por lo tanto, no tendrá estos problemas ambiguos ni conflictivos, independientemente de cuántos servicios use el cliente. aplicación


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). Allí puede especificar una asignación de espacio de nombres usando el parámetro / n como este:

"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^

Por lo tanto, todos los contratos de datos con el espacio de nombres http://youruri.org/CustomerService/DataContracts se generan en el espacio de nombres clr CLR.Namespace.CustomerService en el archivo 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 (consulte el significado del asterisco para captar todo)

El proceso requiere algo de preparación porque tienes que crear manualmente los archivos por lotes, pero una vez hecho esto, funciona bien.