Hace unos tres años Microsoft lanzó IISExpress, una versión ligera de su servidor Web y servidor de aplicaciones, pensada fundamentalmente para ser utilizada por parte de los desarrolladores. Hasta entonces cuando queríamos probar y depurar una aplicación web desde Visual Studio teníamos básicamente dos opciones:
- Usar el servidor de desarrollo integrado, conocido comúnmente como “Cassini”. El problema es que no era el servidor verdadero y había ciertas diferencias con un entorno de producción real. Además no permitía usar otras tecnologías como PHP o ASP Clásico, y a veces era necesario por que tenemos aplicaciones mixtas.
- Usar el propio Internet Information Server, que sí que era ya como el entorno real y no tenía ningún tipo de limitaciones. El problema es que para poder usarlo necesitas permisos de administrador y además implica configurar el proyecto en IIS en cada máquina en la que quieras desarrollar.
Buscando solucionar las “pegas” de estas dos opciones y tener lo mejor de ambas nació IIS Express: es ligero y sin necesidad de configuración ni de permisos de administración, pero al mismo tiempo es también “the real thing”, o sea, que al ser el mismo motor exactamente que en IIS podemos sacar partido a todas las características de éste sin problema.
Ya hablé aquí en su momento de esta herramienta y cómo podíamos integrarla con Visual Studio 2010. Con Visual Studio 2012 y versiones posteriores ya viene integrado de serie en el entorno y es el servidor que se usa por omisión, por lo que no hay necesidad de descargarlo ni de configurar nada. De todos modos si lo necesitas te lo puedes descargar independientemente. La última versión, IIS 8.0 Express, la puedes descargar gratis desde aquí.
Sólo se permiten conexiones locales
Una limitación por defecto que trae IIS Express es que solamente permite conexiones desde la máquina local. Esto es lógico pues está pensado fundamentalmente para que lo usemos como herramienta de prueba y depuración de nuestras aplicaciones, y sobre todo con Visual Studio. Sin embargo en ocasiones esto no será suficiente y necesitaremos que otros usuarios se puedan conectar a nuestra aplicación desde otros equipos. Por ejemplo, para que otros programadores de nuestro equipo puedan conectarse a la aplicación en desarrollo con el navegador y validen su interfaz de usuario, o para poder depurarla entre varias personas a la vez, sobre todo si se refiere a la parte de interfaz de usuario.
¿Cómo podemos permitir conexiones externas?
Hay que realizar varios pasos para poder conseguirlo.
1.- Decide qué puerto usará tu aplicación Web y no lo vuelvas a cambiar.
2.- Configura HTTP.sys para que escuche en el puerto que has seleccionado.
Http.sys es el componente del sistema operativo que se encarga de gestionar las peticiones HTTP, y que es utilizado tanto por IIS como por IIS Express. Por defecto las aplicaciones que lo utilizan sin privilegios de administración no pueden hacer uso del mismo para escuchar peticiones externas, fuera de la máquina local. Esto se hace así por seguridad, para evitar que cualquier malware monte un servidor web en tu equipo y pueda recibir peticiones. Para poder lanzar IIS Express sin ser administrador y poder escuchar peticiones desde fuera de la máquina local tenemos que habilitar permisos para ello. Abre una línea de comandos como administrador y escribe la siguiente instrucción si tu máquina, como la mía, está instalada con Windows en inglés:
netsh http add urlacl url=http://tumaquina:xxxx/ user=everyone
sustituyendo el nombre de tu máquina (que es el que usarán para conectarse los demás) y las XXXX por el puerto que hayas elegido en el paso anterior.
Si tu sistema operativo está en español, entonces tienes que cambiar el grupo de usuarios “everyone” por “todos”, así:
netsh http add urlacl url=http://tumaquina:xxxx/ user=todos
3.- Añade el “binding” correspondiente a la configuración de IIS Express. Lo habitual para lanzar la aplicación a voluntad, sin tener que abrir Visual Studio y lanzar una sesión de depuración, es crear un archivo .bat. Puedes usar una instrucción como la siguiente dentro del .bat:
"C:\Program Files\IIS Express\iisexpress.exe" /config:C:\MiApp\applicationhost.config
Este archivo de configuración indica el comportamiento que presentará IIS Express. Lo mejor es copiarlo directamente de un IIS real ya configurado exactamente como queramos, y luego partir de ese para ajustar lo que necesitemos, pero como mínimo tiene que tener los siguientes nodos:
<system.applicationHost>
<listenerAdapters>
<add name="http" />
</listenerAdapters>
<sites>
<site name="Desarrollos" id="1" serverAutoStart="true">
<application path="/" applicationPool="MiAppPool">
<virtualDirectory path="/" physicalPath="C:\MiApp" />
</application>
<bindings>
<binding protocol="http" bindingInformation=":XXXX:localhost" />
<binding protocol="http" bindingInformation="*:XXXX:nombreMaquina" />
</bindings>
</site>
<siteDefaults>
<logFile logFormat="W3C" directory="%IIS_USER_HOME%\Logs" />
<traceFailedRequestsLogging directory="%IIS_USER_HOME%\TraceLogFiles" enabled="true" maxLogFileSizeKB="1024" />
</siteDefaults>
<applicationDefaults applicationPool="MiAppPool" />
<virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>
</system.applicationHost>
He resaltado un poco más grande el nodo que debemos añadir nosotros para que funcione en la nueva dirección externa. Ello supone añadir un nuevo “binding” a la sección de “bindings” de IIS Express, de modo que también responda a peticiones en la dirección que hayamos elegido (hay que sustituir nuevamente XXXX por el puerto elegido y poner el nombre de nuestra máquina).
Si tenías IIS Express ya lanzado tienes que cerrarlo y volver a lanzar la aplicación Web con el .bat que has creado.
4.- Habilitar una regla en el cortafuegos para permitir la conexión externa.
Abre el firewall del sistema. Búscalo en Inicio, necesitarás abrirlo como administrador. En Windows 7:
En Windows 8.1:
En la ventana que aparece crea una nueva regla en la lista de reglas entrantes para permitir la conexión al puerto elegido por TCP a todos los equipos del dominio (o incluso con acceso público si eso es lo que quieres). Dale un nombre descriptivo (como “Acceso externo a mi app web" con IIS Express”.
¡Listo! Reinicia tu app en IIS Express lanzándolo con el archivo .bat y ya deberías servir páginas externamente y poder conectarte desde otros equipos.
ACTUALIZACIÓN 5/5/2014: Si a pesar de que has seguido todos los pasos anteriores, al lanzar el .bat recibes un error en color rojo diciendo que no tienes permisos para lanzar IISExpress en esa dirección, tienes dos soluciones:
- Lanzar el .bat como administrador local de la máquina.
- Reservar la dirección concediéndole permisos al usuario actual, de modo que pueda lanzarlo sin problemas. Para ello lo único que tienes que hacer es abrir una línea de comandos con permisos de administrador y escribir el siguiente comando (sustituyendo la máquina, el puerto, el dominio y el usuario por los correctos):
netsh http add urlacl url=http://nombremaquina:XXXX/ user=dominio\usuario
¡Espero que te sea útil!