En un post anterior ya comentaba que en Windows Communication Foundation ( WCF ) no es oro todo lo que reluce y algunas cosas me hacen reafirmarme en mi opinión. Hace poco tuvimos un «problema» con WCF que me dejó bastante contrariado. A continuación intentaré explicar lo que pasó.
Haciendo unas pruebas de carga sobre la aplicación web que estamos desarrollando nos dimos cuenta de que el rendimiento de la aplicación era bastante malo, porque cada vez que hacíamos una petición al servidor se lanzaba el compilador, el proceso csc.exe. Lógicamente, el rendimiento era malísimo porque el proceso csc.exe se quedaba con gran parte de la CPU, lo que hacía que se procesasen muy pocas peticiones.
Pero..¿ Por qué se lanza el compilador ? ¿ Qué sentido tiene ? En una versión release no le veo sentido por ningún lado….pero sí, sí tiene sentido.Y el sentido está en que usamos comunicación wcf entre la consola web y la lógica de negocio y en que en muchos casos se usan DataSets.
Cuando el cliente WCF genera el proxy para llamar al servidor automáticamente se crean clases con el atributo XmlSerializer para poder llamar al servidor.
El cliente, en tiempo de ejecución, por cada tipo de datos que es serializable y que usa XmlSerializer genera y compila código para serializarlo, lo que puede provocar un decremento importante en el rendimiento de la aplicación….y de hecho, eso está provocando.
Por tanto, aunque a nosotros se nos ha manifestado por usar DataSets, podría darse siempre que se usen tipo serializables con XmlSerializer.
Pero todo tiene solución y se puede cambiar este comportamiento y así evitar que se lance el compilador. La herramienta svcutil nos pérmite mejorar el rendimiento de nuestra aplicación generando el código de serialización necesario para nuestros tipos serializables evitando que esta operación se haga en tiempo de ejecución.
La secuencia a seguir es la siguiente:
Compilar el proyecto que tiene las clases proxys, es decir, las clases XmlSerializer.
Utilizar la herramienta
svcutil.exe para generar el código de serialización para los tipos contenidos dentro del binario.
Incluir el fichero cs generado dentro de un proyecto llamado [original assembly].XmlSerializer.dll.
Compilar el proyecto.
Incluir el nuevo binario generado en el mismo directorio que el assembly que contiene los proxys.
Y ya está, ya no se vuelve a volver a ver el proceso csc.exe.
Como he comentado antes, esta situación podría darse en otras situaciones que no tengan nada que ver con los proxys wcf. Para estas situaciones existe otra utilidad llamada sgen.exe, que permite obtener la misma funcionalidad que hemos comentado, con la salvedad de que sgen ya genera directamente el assembly necesario para la serialización y no sólo el código fuente.
Para finalizar, comentar que aunque sea una situación normal la que he comentado, me parece bastante absurdo que sea una comportamiento por defecto. Esto sí que sigo sin entenderlo….