Embebiendo controles Windows en Web. IExplorer.exe.config

Un día de estos os contaré como embeber un control windows en una página web. A grandes rasgos podremos decir que es algo así como incluir en el HTML un objeto de la siguiente forma:


<object id=»IdDelObjeto»  classid=»http:CarpetaContenedora/nombreDll.dll#Namespace.NombreDelControl»>
       <param name=»NombreParametro» value=»ValorParametero» />
</object>


Previamente habremos creado un proyecto de biblioteca de controles (que se llamará «nombreDll» y generará «nombreDll.dll»), en la cual estará montado nuestro control llamado «NombreDelControl» y estará incluído en el namespace «Namespace». Esa dll la pondremos bajo nuestro sitio web y con «http:CarpetaContenedora/nombreDll.dll» indicaremos la ruta (suponiendo que http es el raíz del sitio web). Bueno, esto es a muy grandes rasgos, otro día os comento los maravillosos problemas que me he encontrado (post que le debo a Unai ;)).


A lo que quería ir es al despliegue. Tras estar la aplicación funcionando perfectamente en desarrollo, sirviendo el control Windows Forms embebido en nuestro Internet Explorer, nos vamos a producción y resulta que no hay forma de que se cargue el control Windows. Durante la carga del mismo capturamos la siguiente excepción:


System.Configuration.ConfigurationException: Error loading XML file http://url/IEXPLORE.EXE.config This is an unexpected token. The expected token is ‘DOCTYPE’. Line n, position m. (http://www.url.com/IEXPLORE.EXE.config).


Parece ser que durante la carga dinámica del control, se hace una llamada al servidor, pidiendo el archivo iexplore.exe.config, y este no es devuelto porque el IIS está configurado por defecto para que no devuelva ficheros *.config al navegador (esas cosas de seguridad ;)). Se plantean dos preguntas:



1) ¿Quién demonios pide el archivo iexplore.exe.config?
2) ¿Como lo solucionamos?



La primera pregunta tiene fácil respuesta. Un Servicio Web. Para cargar los datos iniciales del control usamos un servicio web, que es el que se encarga de llamar al iexplore.exe.config.



La segunda tiene más miga. Una forma de solucionarlo es la siguiente:



El enlace dinámico falla porque la ruta base de la aplicación es el raiz de nuestro directorio virtual, de manera que no encuentra el control a cargar. Por ello, tenemos que indicárselo, y para ello, podemos crear el fichero «iexplore.exe.config» en el raíz del directorio virtual, conteniendo este la ruta real de donde tiene que coger el control. El fichero «iexplore.exe.config» quedaría así:


<configuration>
  <runtime>
     <assemblyBinding xmlns=»urn:schemas-microsoft-com:asm.v1″>
          <probing privatePath=»www.UrlDeProduccion.com/CarpetaContenedora»/>
     </assemblyBinding>
   </runtime>
</configuration>


Imagino que habrá soluciones más elegantes, pero esto funciona perfectamente y no compromete la seguridad en absoluto, al no modificar la configuración del IIS para que permita el envío de los ficheros *.config al navegador.


¡¡Saludos!!

Performance: String o StringBuilder

 

Bueno, antes de la etapa de refactorización, y para ver como podemos enfocarla, toca profiling de mi parte del proyecto.


Primero, y lo importante, es buscar un buen profiler para comprar la licencia, así que empezamos tirando de trials. Aquí lo poco que he probado.



  • RedGate Ants Profiler (595$): Ya lo había probado en otros proyectos, y me gusta mucho. Es intuitivo y con una presentación de resultados muy fácil de interpretar. Aquí le podéis echar un vistazo: http://www.red-gate.com/products/ANTS_Profiler/index.htm

  • JetBrains DotTrace (499$): No lo conocía, y no me ha gustado mucho, quizás porque lo comparaba con Ants. Es algo más barato que Ants, aunque Ants incluye software para test de aplicaciones y servicios web muy completo, mucho más que el de DotTrace.

  • CLR Profiler: Profiler gratuíto que nos regala Microsoft. Como su propio nombre indica, exclusivamente hace profiling del CLR, aunque casualmente, y para el caso que me ocupaba, me resolvió unas cuantas dudas.

 


Expongo mi caso:


Mantengo en memoria de mi aplicación una lista de strings bastante seria (en las que cargo urls para generar ficheros .asx -listas de reproducción para wmp-). Además mantengo otras listas de strings similares, y al hacer el profiling, veo que la mayoría de la memoria está ocupada por strings. Eso ya lo suponía, por lo que decido cambiar esos strings por objetos  de la clase StringBuilder, para analizar la diferencia de comportamiento. Una vez hecho esto, vuelvo a realizar un profiling, esperando haber mejorado algo, y pum!!, sorpresa: el rendimiento empeora por mucho.



 


Pero aún más asombrado me encuentro cuando veo el histograma de vida de los objetos por edad (fijarse en las estadísticas de recolección de basura)



 


Además de dar a entender que mi manejo del Paint es  vergonzoso, se observa una sobrecarga de instancias de la clase String (en rojo) mucho mayor, cuando en varios artículos indicaba lo contrario.


¿Entonces, qué está pasando aquí? El problema es inherente a la arquitectura de la clase String y la clase StringBuilder. Un StringBuilder contiene un buffer, de forma que siempre que necesitemos aumentar memoria, para realizar cualquier operación (concatenación, reemplazo, etc…), lo que se aumenta es el buffer del StringBuilder. Sin embargo, un String se comporta de otra forma; cuando necesita ampliar la memoria que necesita, crea una nueva instancia del mismo del tamaño adecuado. Recordemos que al CLR una de las operaciones que más le cuesta es crear instancias de las clases, lo que hace que el rendimiento de la aplicación decayese en caso de utilizar una gran carga de Strings (esto no es correcto del todo, ahora llegamos al kit de la cuestión).


Entonces, si esto es así, ¿porqué demonios he perdido rendimiento utilizando StringBuilders? Como suele pasar, todo es relativo, y a la hora de decantarse por un String o por un StringBuilder, debemos analizar QUÉ vamos a hacer con él. En mi caso, creo los objetos, les asigno un valor y luego utilizo ese valor. Al hacerlo con un StringBuilder, la instancia es más pesada (recordemos el buffer que lleva) y eso hace que el tamaño de memoria commited aumenten tanto; si durante la ejecución realizase operaciones con la instancia que obligasen a modificar su tamaño (concatenaciones, eliminaciones, reemplazos, etc…), estaría utilizando la ventaja que aporta el StringBuilder, pero como en mi caso no realizo prácticamente ninguna operación de esas, en lugar de resultar ventajoso, me ocasiona una sobrecarga de memoria que hace decaer el rendimiento de la aplicación.


 


Quería compartir con vosotros esto, porque seguro que se me escapan mil cosas, pero también sé que muchísima gente no le da importancia a este tema, y como decía el anuncio de la DGT, «las imprudencias se pagan carísimas» :D.


 


¡¡Saludos!!

En su día, fui "toucheado"

Pues eso, que ya que leí todos vuestros secretos más internos, y además fui tocado por varios flancos, a pesar de que ya todos lo hicísteis, contaré yo mis cinco ultrasecretos privadérrimos que conoce mucha gente :D, pero muchos de vosotros no sabéis ;):


1) No tuve ni Amstrad, ni Spectrum, ni programé de peque, ni jugaba a ningún juego de ordenador ni de rol. Mi primer ordenador lo tuve ya de grandecito, un año antes de empezar la carrera. A partir del primer año de carrera, comencé a odiar el desarrollo y todo lo que tuviese que ver con el Software con todas mis ganas. ¿Y entonces qué pinto aquí? Pues ya véis, gracias a que alguien (con el pelo largo, pero desgraciadamente hombre -o eso creo, ¿no, Pableras :P?-) me ayudó a darme cuenta de que esto era divertido, empecé a darme caña hasta el día de hoy, que a pesar de tener muchíiiiiiiiiiiiiiiiiiisimo por aprender, si que puedo estar orgulloso de compartir comunidad con vosotros.


2) Soy apasional. Como me dice mi madre, un sieso. No tengo pasión por nada, a pesar de que me encanta hacer muchas cosas. Me encanta mi trabajo, adoro el deporte (el balonmano, por encima de todo), disfruto con una buena cerveza y mejor compañía, me chiflan las cosas que se mueven (si tienen motor  y ruedas, más aún), me gusta mucho la tranquilidad y la buena gente, peeeero, no no sería capaz de renunciar a ninguna cosa por otra. Me explico; si me obligan a dejar de hacer todo lo relacionado con mi trabajo por el balonmano, no lo haría. Y viceversa, y lo mismo con el resto de cosas.


3) Me he convertido en un persona bastante radical. Antes no lo era, ahora tengo ideas muy marcadas y me gusta defenderlas. Eso sí, desde el respeto. Y no me refiero a ideas políticas ni nada parecido, me refiero a tener las cosas claras en general. Me gusta marcarme un camino, metas, y tratar de cumplirlas. Obviamente, con el tiempo se aprenden muchas cosas y tus ideas cambian, pero siempre me gusta tener un referente. Me encanta discutir, pero no a malas, simplemente hablar las cosas con alguien que no piense como tú, porque aprendes un montón sobre la forma de ver las cosas de otras personas, y eso hace que crezcas como individuo.


4) Como he dicho antes, adoro el deporte, y en especial el balonmano. Soy un deportista frustrado, jejejej, me he pasado media vida jugando a balonmano. Jugué 12 años, estuve 6 parado y hace dos años jugué otra temporada. Con un poco de suerte, la temporada que viene volveré a estar en activo, volveré a disfrutar de la competición (me pierde, soy extremadamente competitivo). Juego de portero, y el mito de que los porteros de balonmano suelen estar locos, es mentira, soy la prueba de ello, porque yo soy un tío muy racional, pero portero :D. Me encanta recibir pelotazos, y aunque parezca una locura, es una sensación increíble poder parar un balón en un partido. Imagino que será similar a meter goles, pero como esas cosas yo no las hago… :D. Ahm, y en breves, y para ponerme en forma, volveré a hacer full-contact (hace un tiempo también lo hice), porque es un deporte muy completo y no hay mejor forma de desestresarse. Ahm, David, ahora que me enseñaste que el bocao hay que cocerlo, un día quedamos para pegarnos :D:D:D


5) Como ya he dicho soy radical en determinados pensamientos. Si hay algo de lo que no se pueda ni se deba hablar conmigo, ese tema son las drogas. No soporto nada que tenga que ver con drogas, no entiendo como alguien puede jugar con fastidiarse la vida siendo consciente de ello. Me parece increíble que la gente, con la información que hay hoy día, aún sea capaz de consumir drogas y decir la frase de «yo controlo». No lo entiendo, y me da tal rabia interna, que habitualmente cuando trato ese tema se me enciende el pilotito de Danger Danger y me convierto en una persona demasiado vehemente. ¡¡Vida sana, chicos, vida sana!!


 Pues eso, ahí están mis cinco cosas. Lo que no voy a hacer es marcar a nadie, porque todos habéis contado ya vuestras cosas, y además me he columpiado temporalmente, esto debería haberlo hecho antes :S:S.

Geeks.Blogs.Add(new FPeula("Fran","Peula","Ariza");

Muy buenas. Soy Fran Peula Ariza, y ustedes me recordarán de series como …. ups!! que se me va. Pues nada, que tras llevar muuuuuuuucho tiempo leyendo por estos lares, y llevar muuuucho tiempo con el blog activo (sorry, Rodrigo ;)) me voy a animar a contar alguna cosilla, aunque lo que en realidad me motiva a empezar el blog es poder compartir algo con todos vosotros, que sois unos monstruos tremendos.


Para que sepáis un poquito de donde salgo, pues fui coordinador del club .NET de Oviedo (chicos, prometo ayudaros en cuanto el tiempo me lo permita!!! snif snif…) y tras un ¿breve? paso por Madrid, volví a mi tierra a desarrollar y esas cosas que hacemos los taraos.


 Nada, que espero ir animándome cada vez más a escribir,  que todos los días os leo pero como siempre estamos faltos de tiempo :S:S:S.