c# - / sharedtypes equivalente para svcutil.exe?
soap wsdl (3)
Creación de una aplicación que depende de un proveedor externo que tiene un conjunto muy detallado de servicios SOAP (estamos hablando de más de 50 archivos WSDL). Sin embargo, cada WSDL individual tiene numerosas declaraciones de tipo compartido. Al generar 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.
Cuando intento generar mi código de cliente, bombardeo estos tipos superpuestos que la tercera parte incluye en todos sus archivos WSDL.
svcutil /t:code /importxmltypes [mypath]/*.wsdl
Resultados en mensajes de error aludiendo a las colisiones de tipo. Por ejemplo, un par de ejemplos de los siguientes mensajes de error:
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.
No tengo control sobre la salida de los WSDLs. No quiero tener que editar los WSDL a mano por temor a un error que se rompa de una manera en tiempo de ejecución que sería muy difícil rastrear hasta nuestra edición de los archivos WSDL. Sin mencionar que hay 50 archivos WSDL que van desde 200 hasta 1200 líneas de XML. (Recuérdame otra vez por qué pensamos que SOAP fue la gran salvación para nosotros a finales de los 90).
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
He estado usando wsdl.exe para solucionar esto porque trabajo con algunos servicios web SOAP que definen los mismos objetos de transferencia de datos en diferentes puntos finales. Entonces uso wsdl.exe porque tiene el modificador sharetypes. No soy un desarrollador de WPF, así que realmente no me importa que la salida no implemente IWhatever para WPF, pero las clases generadas son todas parciales, así que puedes hacer un poco de trabajo para implementar las interfaces que te interesan en un archivo separado.
Intente especificar todos los WSDL en un comando:
svcutil http://example.com/service1?wsdl http://example.com/service2?wsdl ...
Esto debería hacerse cargo automáticamente de los tipos duplicados. Otra opción es echar un vistazo al interruptor de comando /reference
:
/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 ya tiene algunos tipos definidos en algún conjunto, puede incluir este conjunto y svcutil
excluirá los tipos para evitar duplicados:
svcutil /reference:someassembly.dll http://example.com/service?wsdl