2008-10-16 19 views
5

Tengo que consumir 2 servicios web diferentes. Ambos contienen una definición para un objeto 'usuario'..Net Consuming Web Service: tipos idénticos en dos servicios diferentes

Cuando me refiero a los servicios utilizando "Agregar referencia de servicio" Doy cada servicio un espacio de nombres único:

com.xyz.appname.ui.usbo.UserManagement  
com.xyz.appname.ui.usbo.AgencyManagement 

El problema que tengo es que cada uno de los servidores proxy que se generan contienen una nueva clase de usuario. Uno está ubicado en com.xyz.appname.ui.usbo.UserManagement.user y el otro en com.xyz.appname.ui.usbo.AgencyManagement.user. Sin embargo, los objetos del usuario son idénticos y me gustaría tratarlos como tales.

¿Hay alguna manera de que de alguna manera pueda hacer referencia al objeto del usuario como un objeto en lugar de tratarlos como dos diferentes?

Estoy usando .Net 3.5 para consumir el servicio. El servicio que se consume está escrito en Java.

Gracias!

Editar:

This forum thread tiene muy cerca de una respuesta, pero la respuesta aceptada terminó siendo para compartir tipos de cliente y servidor - que no puedo hacer, porque estamos cruzando plataformas (Java .Net). La verdadera pregunta es, ¿hay algún tipo de parámetro/sharetypes para svcutil en WCF?

+0

¿Cómo afectará esto a Java? la herramienta WSDL genera el código C#. – leppie

+0

Motivo Agregué que la plataforma de servicio era Java porque la primera respuesta que recibí sugería compartir tipos .Net entre el cliente y el servidor. –

Respuesta

3

Lo que terminó funcionando para mí fue proporcionar al svcutil.exe todas las direcciones WSDL que necesitaba para generar código. SVCUTIL examinará todos los tipos de cada servicio y determinará automáticamente cuáles son comunes y se deben reutilizar.

El tipo que desea compartir también debe tener un espacio de nombres compartido, y ese espacio de nombres debe llamarse en cada uno de los servicios web que desean compartir ese tipo.

+0

Steve, ¿puedes aceptar esto como la respuesta? –

+0

Eso sería "sí". –

0

Puede poner el usuario tipo en un conjunto común compartido al que hacen referencia los servicios y el proyecto del cliente. Luego, en la configuración para ambos clientes de servicio, puede elegir la opción de volver a utilizar los tipos en los ensamblados a los que se hace referencia. De esta forma, está utilizando el tipo en el ensamblaje en lugar de una clase generada por separado.

2

la herramienta WSDL tiene un parámetro.

/sharetypes 
    Turns on type sharing feature. This feature creates one code file with 
    a single type definition for identical types shared between different 
    services (namespace, name and wire signature must be identical). 
    Reference the services with http:// URLs as command-line parameters 
    or create a discomap document for local files. 
1

Esta es una situación común cuando se consumen servicios web con diferentes puntos finales del mismo proveedor.

Puede utilizar la herramienta de línea de comandos "wsdl.exe/sharetypes" para crear una clase de proxy compartida que examinará todos los puntos finales que proporcione, e infórmese qué clases pueden 'compartirse'.

En su ejemplo, siempre que su objeto de usuario sea idéntico en ambos servicios, será recogido e incluido en su nueva clase de proxy compartido.

Probablemente tenga sentido agregar este paso de generación de clase de proxy compartida como un evento de compilación en su proyecto de esa manera siempre estará actualizado.

2

Si está trabajando con los archivos locales, puede hacer lo siguiente:

wsdl.exe /sharetypes file://c:\path\to\file.wsdl file://c:\path\to\otherFile.wsdl /namespace:<your namespace> /output:(any switches etc...) 

El interruptor de sharetypes requiere que proporcione las direcciones URL a los servicios, y no funciona si simplemente apuntar a los archivos WSDL .

+0

Me preguntaba sobre lo de la url, gracias .. +1 –

+0

¡Esto funcionó muy bien para mí! ¡Gracias! – ScArcher2