2011-01-24 16 views
8

Estoy intentando escribir algún código en C# que llame a un servicio WCF sobre la marcha importando el WSDL, examinándolo y luego haciendo llamadas a él dinámicamente.Llamar a un servicio WCF sin generar un ensamblaje

El servicio al que estoy llamando puede cambiar de vez en cuando, por lo que quiero que mi cliente conozca nuevos métodos y nuevos parámetros de entrada y salida para las llamadas, sin reconstruir mi cliente.

Una posible solución a esto es importar y compilar una referencia de servicio sobre la marcha.

esbozado aquí: Creating an assembly on the fly from a WSDL

me gustaría evitar la generación de un ensamblaje y luego reflexionar sobre ella, si es posible.

Miré en el código del proxy dinámico en el enlace y usan una clase de marco para hacer la importación. Esta clase es WsdlImporter. Así que lo pensé muy bien: puedo usar eso y examinar el esquema WSDL y determinar qué llamadas están presentes y qué entradas y salidas están disponibles.

El problema es que la información de tipo falta en los objetos MessagePartDescription que crea el WsdlImporter. Aparentemente esto falta because it cannot find the types yet - see the response to the question from Brian.

¿Algún consejo sobre cómo debo proceder? ¿Estoy completamente en el camino equivocado aquí?

+0

¿Puede dar un ejemplo del mundo real de cómo esto sería útil? ¿Hay una interfaz de usuario presentada a un usuario de su cliente que le permite seleccionar métodos para llamar, tal vez algún tipo de programador o algo así? Además, ¿qué hay de malo en crear un ensamblaje sobre la marcha? Eso suena bastante directo. ¿Estás imaginando algo más simple que la reflexión? Tengo problemas imaginando lo que sería. – JohnOpincar

+1

Esto se usará para llamar a un servicio WF. El flujo de trabajo puede cambiar: se pueden agregar/eliminar pasos, etc. – Neil

+0

@JohnOpincar - Mi objeción no es a la reflexión, sino a la compilación sobre la marcha del ensamblaje. Parece que es un enfoque que puede causar problemas de seguridad en algún momento, y * puede * ser frágil. También me parece extraño que cuando toda la información esté en el WSDL y dado que eventualmente las llamadas serán ordenadas a través de algo que se parece mucho a una API dinámica que construye una capa dinámica con reflexión sobre una capa estática que fue creado dinámicamente que luego se mapeó a una capa dinámica es un poco mucho. Crear el ensamblaje sobre la marcha es mi plan de respaldo. – Neil

Respuesta

5

Probablemente esta no sea una respuesta, pero la publicaré como una para describir completamente mi opinión.

Proxy dinámico:
IMO esto es un ejemplo de uso incorrecto de la tecnología. Es un comportamiento elemental de WSDL: si cambia debe cambiar de cliente o debe realizar un buen versionado de WSDL y crear un nuevo cliente.

Todavía tiene que decir de alguna manera que su cliente obtenga WSDL, ¿significa que analizará WSDL antes de cada llamada? No parece una buena idea

La información sobre los tipos realmente no forma parte de WSDL porque, de forma predeterminada, WSDL se genera como interoperable. Los tipos de CLR no son operaciones necesarias para la interoperabilidad. Cuando crea un proxy de servicio mediante Agregar referencia de servicio o Svcutil, generará código para los tipos definidos en WSDL. Ese código luego necesita ser compilado.

Puede intentar utilizar NetDataContractSerializer en lugar de DataContractSerializer predeterminado. NetDataContractSerializer agrega información de tipo CLR a WSDL, pero aún espero que los nuevos tipos sean conocidos por sus clientes, es decir, implementar nuevos ensamblajes con tipos y usarlos por los clientes. Esto casi suena como el mismo enfoque cuando simplemente se implementa el ensamblado con un nuevo proxy de cliente estático.

dinámico WF cliente
Asimismo, no veo mucho uso de esta arquitectura - que todavía tienen que cambiar cliente para reflejar las nuevas medidas de WF, ¿verdad?

Cambiando la WF
¿Estamos hablando de la fundación Windows Workflow? Apenas puedo imaginar el escenario donde se crea WF, se lo expone como un servicio y luego se lo cambia. Cuando expone WF como servicio, probablemente esté definiendo WF de larga ejecución. Las WF de larga ejecución usan persistencia basada en la serialización (al menos en WF 3.5 pero creo que es lo mismo en WF 4).Cuando cambias la definición de WF, todos los WF persistentes probablemente están condenados porque nunca se deserializarán. Esta situación generalmente se resuelve mediante el despliegue paralelo de la versión nueva y antigua, donde la versión anterior solo se utiliza para finalizar archivos WF incompletos. Nuevamente significa nuevos clientes.

+0

Gracias por su comentario, ya que dice que no resuelve mi problema, pero voy a +1 porque es estimulante - Estoy de acuerdo con su evaluación de WSDL en lo que respecta a los tipos. Sin embargo, si el WsdlImporter me permitiera ver cuáles eran los tipos de WSDL, podría llegar a donde quisiera ir. No necesito el tipo de CLR. Vea mi próximo comentario sobre clientes dinámicos. – Neil

+1

Estamos hablando de clases de WF de larga ejecución. No hay ninguna razón por la cual agregar un paso a mi flujo de trabajo requiera la reconstrucción de un cliente que no realiza ese paso. Además, si desea construir una red troncal para gestionar las interacciones de sus clientes con el flujo de trabajo y hacer que todos los clientes se ajusten a una interfaz estándar, debe canalizar todas las llamadas a través de una API más estrecha que la API que creará un servicio WF. – Neil

+0

@Neil: en tal caso, probablemente iría en otra dirección. Mantendría toda esta complejidad en el lado del servidor. Significa alojar WF en su proceso y exponer el servicio web con una interfaz conocida preparada para los cambios de WF. Es una idea de alto nivel, pero debería ser posible y sería más fácil que "cliente de servicio web dinámico". –

1

Si observa el problema desde un ángulo diferente. ¿Necesita volver a generar el proxy cada vez o necesita un contrato que continúe funcionando cuando cambien las cosas?

WCF tiene un mecanismo para esta IExtensibleDataContracts ver: http://msdn.microsoft.com/en-us/library/ms731083%28v=VS.100%29.aspx

Las mejores prácticas para el control de versiones de los contratos se pueden encontrar here

+0

+1 Gracias por la respuesta, puede ser útil para otros.Lamentablemente, tenemos un control limitado sobre el servicio WCF que WF genera, por lo que realmente no podemos seguir esa ruta. – Neil

Cuestiones relacionadas