2010-03-02 14 views
17

La construcción de una aplicación que se basa en un proveedor de 3 ª parte que tiene un conjunto muy detallado de los servicios SOAP (estamos hablando de más de 50 archivos WSDL). Sin embargo, cada WSDL individual tiene numerosas declaraciones de tipos compartidos. Al generar el código de cliente con wsdl.exe, solía haber un indicador/sharedtypes que fusionaría entradas duplicadas si se encontraba un tipo varias veces./sharedtypes equivalent for svcutil.exe?

Cuando intento para generar el código cliente, bomba sobre estos tipos se solapan y que la tercera parte incluye en todos sus archivos WSDL.

svcutil /t:code /importxmltypes [mypath]/*.wsdl 

Resultados en mensajes de error alusivos a las colisiones de tipo. Por ejemplo, un par de muestras de los mensajes de error siguientes:

Error: There was an error verifying some XML Schemas generated during export: 
The simpleType 'http://common.soap.3rdparty.com:CurrencyNotation' has already been 
declared. 

Error: There was an error verifying some XML Schemas generated during export: 
The complexType 'http://common.soap.3rdparty.com:NumberFormat' has already been 
declared. 

que no tienen control sobre la salida de los WSDL. No quiero tener que editar los WSDL a mano por temor a un error que se rompa de una manera en el tiempo de ejecución que sería muy difícil de rastrear a nuestra edición de los archivos WSDL. Sin mencionar que hay 50 archivos WSDL que van de 200 a 1200 líneas de XML. (Recuérdame otra vez por qué pensamos jabón era la gran salvación a todos nosotros a finales de los años 90?)

Respuesta

2

intente especificar todos los WSDL en un comando:

svcutil http://example.com/service1?wsdl http://example.com/service2?wsdl ... 

Esto debe tomar automáticamente de tipos duplicados . Otra opción es tomar un vistazo en el interruptor de /reference comando:

/reference:<file path>  - Add the specified assembly to the set of 
           assemblies used for resolving type 
           references. If you are exporting or 
           validating a service that uses 3rd-party 
           extensions (Behaviors, Bindings and 
           BindingElements) registered in config use 
           this option to locate extension assemblies 
           that are not in the GAC. (Short Form: /r) 

Esto significa que si usted ya tiene algunos tipos definidos en ciertos procedimientos de montaje puede incluir este montaje y svcutil va a excluir tipos de ella para evitar duplicados:

svcutil /reference:someassembly.dll http://example.com/service?wsdl 
+1

Todos los WSDL son locales, pero eso no viene al caso. Mi problema no es que no pueda pasar varios archivos .wsdl. El problema es que la fuente ha incluido múltiples tipos de datos en cada archivo wsdl (o varios, si no todos). Por ejemplo, navegando, de los primeros 6 wsdls que abrí, parece que 5 tienen una entrada ComplexElement para un tipo llamado CurrencyNotation. Cuando svcutil intenta analizar todos mis wsdls, dice, oh hey, currencyNotation ya existe, LO SIENTO. AUGE. – bakasan

+0

Así que estás diciendo que teclear individualmente cada ruta wsdl se comportará de manera diferente a going * .wsdl (todas las wsdls residen localmente). Como esta es la primera generación de nuestros proxies, realmente no tengo un ensamblado al que hacer referencia. ¿Sería una estrategia analizar un wsdl, compilarlo en un dll y luego hacer referencia al siguiente? ¿Resolver engaños, luego enjuagar y repetir para el resto? – bakasan

+2

no estaba listo para escribir las rutas de los más de 50 archivos WSDL, pero las pruebas w/sólo dos, svcutil foo.wsdl bar.wsdl bombardearon a cabo w/el mismo mensaje de tipos duplicados. Después de haber tratado con dolores de wsdl.exe hace años, no es muy reconfortante ver que svcutil.exe en este día y edad no parece mucho mejor. :PAG – bakasan

0

que estaba teniendo problemas similares. Al definir diferentes espacios de nombres CLR para los diferentes espacios de nombres xml (usando el argumento/namespace de svcutil) pude hacerlo funcionar.

/namespace:http://www.opengis.net/gml,OpenGIS.GML 
0

He estado usando wsdl.exe a conseguir alrededor de esto porque trabajo con algunos servicios web SOAP de que definen los mismos objetos de transferencia de datos en diferentes puntos finales. Entonces uso wsdl.exe porque tiene el modificador sharetypes. No soy desarrollador de WPF, así que realmente no me importa que el resultado no implemente IWhatever para WPF, pero las clases generadas son todas parciales, por lo que puede trabajar para implementar las interfaces que le interesan en un archivo separado.