Locura en la configuración de Windows Communication Foundation

Windows Communication Foundation fue creado para permitir la creación de aplicaciones distribuidas, dándonos una librería de herramientas de comunicación que podemos reusar, sin necesidad de escribir el Service Interface y el Service Gateway desde cero. Tecnologías como servicios web han evolucionado, tienen varias versiones y detalles a tener en cuenta si queremos una comunicación segura, confiable y que soporte interoperabilidad.

El concepto de un Service Model, es ungran avance. Pero hoy, quiero levantar mi mano, para apuntar a algo que hace a WCF una solución”convoluted”. Me refiero a la configuración de WCF.

Si uno quiere usar cualquier característica de WCF, más allá de las más simple, se encontrará rápidamente peleándose con las opciones de configuración de esta bestia. ¿Un síntoma? Si Ud. se olvida de una mínima parte, el canal no funcionará. Si Ud. omite alguna opción de configuración cuando crea un certificado, y se olvida de hacer un paso, entre una docena de pasos de una “to do list”, la llamada via WCF no podrá ser completada. Y tendrá que manejar una cantidad de conceptos, como certificados, tokens, issers, chain of trusts, behaviors, bindings, endpoints, identities, custom bindings, factories, service hosts, channel factories, security options, enumeration types, extensions methods, and… Podría continuar enumerando por horas.

Un ejemplo mínimo. Buscando por la web, encuentro el artículo

WCF (Windows Communication Foundation) Example

Leo ahí:

Being able to switch the transport layer from TCP (Secure SSL) into HTTP with some simple code, that’s amazing!

Sí, correcto, pero

I did have some problems, though. The tcpBinding.Security.Mode = SecurityMode.None; is very crucial on both sides. I’m not sure what it does, but it does not turn off the security completely as I have read in my references. There is still SSL encryption, but on a lower level. It is possible to add certificates to the connection, which also makes the connection more secure.

Acá está el problema. Si uno juega explorando las distintas propiedades y métodos de los bindings y endpoints disponibles, entraremos en un laberinto sin salida visible. Notemos que el autor del artículo no está seguro sobre una de las opciones de configuración que está usando. Y eso que es una sola opción: hay docenas más para configurar, si uno quiere hacer ajuste fino del servicio.

Claro, hay configuración declarativa, no por código. Y hasta podemos usar el  WCF configuration wizard:

Ok, ¿pueden ver los tres tabs, a la derecha? ¡Son más opciones para llenar y entender! ¿Pueden ver el árbol a la izquierda? Es sólo la punta visible de un iceberg. Si expandimos la rama de bindings, entraremos en nuevo mundo de Narnia:

Más propiedades para llenar, ¡y más tabs! Empezará a sentirse incómodo. Si tiene coraje, cree y expanda cualquier cosa en el branch advanced:

El árbol comienza a parecerse a una selva amazónica. Podría tomar capturas de pantallas de cada una de las ramas que el wizard expone, en tal cantidad que podría publicar un volumen completo.

Mucas de estas opciones SON REQUERIDAS si queremos asegurar la comunicación de nuestro servicio, usar tokens emitidos por otras máquinas, definir la autenticación del cliente que invoca y el servicio que atiende, y más. Mi punto es: si Ud. falla en llenar y definir una mínima parte de todo esto, su sistema será un castillo de arena, una torre de cartas en delicado equilibrio. Parace un efecto mariposa: el vuelo de una mariposa en un archivo de configuración, podría crear una tormenta en el resto del sistema. Deberá prestar atención a DEMASIADOS detalles. Es común tener que prestar atención a los detalles en el desarrollo de software. Pero en este caso, pienso que es demasiado: es insano para cualquier mente humana, o para un equipo de desarrollo y despliegue.

En otros sistemas, también tenemos multitud de opciones (¿recuerdan las propiedades un control de formulario?). Pero uno no conocerlas en profundidad a todas (ni siquiera a la mitad), para conseguir algo útil. No es el caso con la configuración de WCF. Este estado de las cosas, apesta. Y si uno quiere escribir directamente en el XML de configuración, terminará con quizás cientos de líneas como:

 

Hay pocas cosas más feas que haya encontrado en mis treinta años de desarrollo (podría enumerar: configuración de EJB, ideas de Cocoon, el Job Control Language en los mainframes IBM…).

Tengo una teoría. Enrico Fermi preguntaba: si los extraterrestres existen, ¿dónde están? ¿por qué no vemos ninguno? La historia es: ellos existen. Comenzaron a estudiar nuestro planeta hace décadas (recuerden, los primeros avistamientos se dieron cerca del Monte Rainier, ¡sí! cerca de Seattle, ya comenzaban a darse cuento que por ahí comenzaba a haber algo raro). Por años, leyeron nuestra literatura, vieron nuestra producción fílmica, hicieron experimentos controlados con seres humanos elegidos. Pero cuando hace unos años comenzaron a estudiar la configuración de EJB y WCF, nuestro planeta estuvo condenado: lo declararon en cuarentena, nadie puede contactarnos, estaremos aislados del resto de la galaxia por diez mil años. La humanidad es una loca civilización, no esperanza sobre nuestro futuro. Nadie puede visitarnos, para que la locura de EJB y WCF no se expanda.

Ok, paro de quejarme. WCF tiene un gran modelo de servicio: ahora, puede manejar JSON, XML, y está preparado para ser flexible y extensible. Pero algunas veces, debemos parar la pelota, y poner en la balanza, no sólo la flexibilidad, sino también la complejidad de la que viene acompañada. Espero escribir posts más positivos, con ejemplos concretos, pero este post ha sido el resultado de días de lucha con WCF, ejemplos, documentación y guías de implementación.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez

This entry was posted in 1389, 3282, 3463. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>