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!!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *