Crear directorios virtuales en IIS express

124

¿Hay alguna forma de crear un directorio virtual en IIS express? Sé que Cassini no puede hacer esto y sería bueno poder hacerlo sin usar una versión completa de IIS.

Lo tengo tan lejos que puedo buscar mi aplicación localmente en IIS express así:

http: // localhost: 1132 /

Lo que me gustaría hacer es crear un directorio virtual llamado "OffSiteStuff" y apuntarlo a alguna ubicación en mi unidad C, como "c: \ offsitestuff" y luego buscar elementos en esa carpeta como este:

http: // localhost: 1132 / OffSiteStuff / UserUploadedImage.jpg

Sé que podría hacer esto con una carpeta dentro de mi sitio y seguir usando IIS Express o, para el caso, el viejo Cassini, pero esta carpeta almacenará imágenes cargadas por los usuarios y realmente no quiero mezclar estas imágenes con archivos de aplicación

La otra solución, "ir a lo grande", es implementar el sitio en una instancia completa de Server 2008 IIS 7.5 cada vez que quiera depurar las características que usan contenido externo, pero eso también es un poco engorroso.

¿Hay alguna manera de hacer esto en el <System.WebServer />elemento de configuración web?

John Hoge
fuente
55
Para Visual Studio 2015, mikedice417.wordpress.com/2015/09/13/… funcionó. El applicationHost.configarchivo se encuentra bajo la raíz del proyecto: ${PROJECT}\.vs\config\applicationHost.config.
Matt
Aquí hay una respuesta que podría ayudarlo: https://stackoverflow.com/a/46260607/2472664
Giovanny Farto M.

Respuestas:

129

La configuración express de IIS es administrada por applicationhost.config.
Lo puedes encontrar en

Carpeta Usuarios \ <nombre de usuario> \ Documentos \ IISExpress \ config.

En el interior puede encontrar la sección de sitios que contiene una sección para cada sitio configurado de IIS Express.

Agregue (o modifique) una sección del sitio como esta:

<site name="WebSiteWithVirtualDirectory" id="20">
   <application path="/" applicationPool="Clr4IntegratedAppPool">
     <virtualDirectory path="/" physicalPath="c:\temp\website1" />
   </application>
   <application path="/OffSiteStuff" applicationPool="Clr4IntegratedAppPool">
     <virtualDirectory path="/" physicalPath="d:\temp\SubFolderApp" />
   </application>
    <bindings>
      <binding protocol="http" bindingInformation="*:1132:localhost" />
   </bindings>
</site>

Prácticamente necesita agregar una nueva etiqueta de aplicación en su sitio para cada directorio virtual. Obtiene mucha flexibilidad porque puede establecer diferentes configuraciones para el directorio virtual (por ejemplo, una versión diferente de .Net Framework)

EDITAR Gracias a Fevzi Apaydın por señalar una solución más elegante.

Puede lograr el mismo resultado agregando una o más etiquetas virtualDirectory a la etiqueta Aplicación:

<site name="WebSiteWithVirtualDirectory" id="20">
   <application path="/" applicationPool="Clr4IntegratedAppPool">
     <virtualDirectory path="/" physicalPath="c:\temp\website1" />
     <virtualDirectory path="/OffSiteStuff" physicalPath="d:\temp\SubFolderApp" />
   </application>
    <bindings>
      <binding protocol="http" bindingInformation="*:1132:localhost" />
   </bindings>
</site>

Referencia:

Mejor.
fuente
Después de agregar cada etiqueta de aplicación para cada directorio virtual, no pude ejecutar la aplicación "offsitestuff". Ej: iisexpress / site: WebSiteWithVirtualDirectory: ejecute la primera aplicación desde la ruta "C: \ temp \ website1". ¿Cómo puedo ejecutar mi segunda aplicación que contiene la ruta "d: \ temp \ SubFolderApp"
Velu
En la sección de enlaces, verá la url y el puerto utilizados para acceder a la raíz de su sitio. Entonces: localhost: 1132 es la url para la aplicación web instalada en c: \ temp \ website1 localhost: 1132 / OffSiteStuff es la url para la aplicación web instalada en d: \ temp \ SubFolderApp.
Be.St.
¿Alguien sabe si / cómo puedo configurar los ajustes por separado para cada proyecto (para poder verificar la configuración)? Gracias
Ian Grainger
1
@Mejor. Me gustaría que cosas como el número de puerto para un sitio IIS sean iguales para todos los desarrolladores, por lo que me gustaría registrar (algunos) la configuración. Pero no puedo hacerlo desde su ubicación actual. Me preguntaba si podría señalarlo a otro archivo al estilo de UserAppSettings, etc.
Ian Grainger
26
Nota: Si bien estas instrucciones aún se aplican a Visual Studio 2015, la ubicación de applicationhost.configha cambiado. Más sensiblemente que las versiones anteriores, ahora se encuentra en la .vs\configsubcarpeta de la carpeta de la solución.
Richard Moss
91

El enfoque de @ Be.St. Es cierto, pero incompleto. Solo estoy copiando su explicación con la corrección de la parte incorrecta.

La configuración express de IIS es administrada por applicationhost.config.
Lo puedes encontrar en

Carpeta Usuarios \ <nombre de usuario> \ Documentos \ IISExpress \ config.

En el interior puede encontrar la sección de sitios que contiene una sección para cada sitio configurado de IIS Express.

Agregue (o modifique) una sección del sitio como esta:

<site name="WebSiteWithVirtualDirectory" id="20">
   <application path="/" applicationPool="Clr4IntegratedAppPool">
     <virtualDirectory path="/" physicalPath="c:\temp\website1" />
     <virtualDirectory path="/OffSiteStuff" physicalPath="d:\temp\SubFolderApp" />
   </application>
   <bindings>
      <binding protocol="http" bindingInformation="*:1132:localhost" />
   </bindings>
</site>

En lugar de agregar un nuevo bloque de aplicación, simplemente debe agregar un nuevo elemento virtualDirectory al elemento primario de la aplicación.

Editar - Visual Studio 2015

Si está buscando el archivo applicationHost.config y está usando VS2015, lo encontrará en:

[directorio_solución] /. vs / config / applicationHost.config

Fevzi Apaydın
fuente
44
¿Hay alguna forma de aplicar esto dentro del proyecto de Visual Studio? En un entorno de múltiples desarrolladores, si alguien más revisa el código en su máquina, entonces su IIS Express local no se configuraría con el directorio virtual y causaría errores de tiempo de ejecución, ¿no?
ahillier88
44
En Visual Studio 2015, el archivo de configuración de IIS se almacena en el directorio de la solución, en una carpeta llamada .vs / config, por lo que puede verificarlo en el control de origen si lo desea.
Randy Gamage
Tantas respuestas sin respuesta que inundan los resultados de Google para esta pregunta en relación con VS 2012. ¡Esto funciona!
Tim Ogilvy
¿Es posible agregar una aplicación separada al directorio virtual en IIS express para poder tener dos aplicaciones en un dominio?
Denys Alexieiev
6

En VS2013 hice esto en los siguientes pasos:

1.Haga clic derecho en el proyecto de la aplicación web y presione Propiedades

2.Ver la pestaña "Web" de la página de Propiedades

3. En Servidores, con "IIS Express" como la opción predeterminada del menú desplegable, en la "URL del proyecto", cambie la url usando el número de puerto a uno que le convenga. Por ejemplo, eliminé el número de puerto y agregué "/ MVCDemo4" después del localhost.

4. Haga clic en el botón "Crear directorio virtual".

5. Ejecute su proyecto y se utilizará la nueva URL

usuario2765861
fuente
1
Esto no le permite configurar la ruta física.
Victorio Berra
2

Si está utilizando Visual Studio 2013 (puede requerir la edición Pro o superior), pude agregar un directorio virtual a un sitio web IIS Express (basado en archivos) haciendo clic derecho en el sitio web en el Explorador de soluciones y haciendo clic en Agregar> Nuevo directorio virtual. Esto agregó una entrada al archivo applicationhost.config como con los métodos manuales descritos aquí.

Bryan B
fuente
0

Tenía algo más, los archivos en sí mismos eran inaccesibles en un entorno SBS.

Elimine los archivos en la carpeta de configuración (si no puede abrirlos) y reemplácelos con una copia de la carpeta en su propia PC local.

Lo arregló para mí :)

NicoJuicy
fuente
Los archivos en Users \ <username> \ Documents \ IISExpress \ config están protegidos por usuario. Quizás hayas intentado editarlo con un usuario diferente. Entonces, para editarlo, debe ejecutar el Bloc de notas (o su editor) en modo Administración. De esta manera puedes modificarlo. O borre y copie como lo hizo :-)
Be.St.
0

Tuve que hacer la entrada en el archivo [proyecto] .vs \ config \ applicationhost.config.

Antes de esto, funcionaba desde la implementación pero no desde el código.

TheJoe
fuente
0

En respuesta a la siguiente pregunta:

"¿hay alguna forma de aplicar esto dentro del proyecto de Visual Studio? En un entorno de desarrolladores múltiples, si alguien más revisa el código en su máquina, entonces su IIS Express local no se configuraría con el directorio virtual y causaría errores de tiempo de ejecución ¿no?

Nunca encontré una respuesta coherente a esto en ningún lado, pero luego descubrí que podría hacerlo con un evento posterior a la compilación utilizando la tarea XmlPoke en el archivo del proyecto para el sitio web:

<Target Name="AfterBuild">
    <!-- Get the local directory root (and strip off the website name) -->
    <PropertyGroup>
        <LocalTarget>$(ProjectDir.Replace('MyWebSite\', ''))</LocalTarget>
    </PropertyGroup>

    <!-- Now change the virtual directories as you need to -->
    <XmlPoke XmlInputPath="..\..\Source\Assemblies\MyWebSite\.vs\MyWebSite\config\applicationhost.config" 
        Value="$(LocalTarget)AnotherVirtual" 
        Query="/configuration/system.applicationHost/sites/site[@name='MyWebSite']/application[@path='/']/virtualDirectory[@path='/AnotherVirtual']/@physicalPath"/>
</Target>

Puede utilizar esta técnica para volver a señalar cualquier cosa en el archivo antes de que IISExpress se inicie. Esto le permitiría forzar inicialmente un archivo applicationHost.config en GIT (suponiendo que gitignore lo ignore) y luego volver a señalar todas las rutas en el momento de la compilación. GIT ignorará cualquier cambio en el archivo, por lo que ahora es fácil compartirlos.

En respuesta a la siguiente pregunta sobre cómo agregar otras aplicaciones en un sitio:

Puede crear el sitio en el archivo de hosts de la aplicación como el de su servidor. Por ejemplo:

  <site name="MyWebSite" id="2">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
      <virtualDirectory path="/" physicalPath="C:\GIT\MyWebSite\Main" />
      <virtualDirectory path="/SharedContent" physicalPath="C:\GIT\SharedContent" />
      <virtualDirectory path="/ServerResources" physicalPath="C:\GIT\ServerResources" />
    </application>
    <application path="/AppSubSite" applicationPool="Clr4IntegratedAppPool">
      <virtualDirectory path="/" physicalPath="C:\GIT\AppSubSite\" />
      <virtualDirectory path="/SharedContent" physicalPath="C:\GIT\SharedContent" />
      <virtualDirectory path="/ServerResources" physicalPath="C:\GIT\ServerResources" />
    </application>
    <bindings>
      <binding protocol="http" bindingInformation="*:4076:localhost" />
    </bindings>
  </site>

Luego use la técnica anterior para cambiar las ubicaciones de las carpetas en el momento de la compilación.

AngryDaz
fuente
¿Es posible agregar una aplicación separada al directorio virtual en IIS express para poder tener dos aplicaciones en un dominio?
Denys Alexieiev