Estoy usando ServerManager (Microsoft.Web.Administration.dll) para crear una aplicación dentro de un sitio web en IIS 7. Necesito crear una aplicación dentro de esta aplicación o convertir un directorio virtual a una aplicación (como la función iis manager, haga clic con el botón derecho -> convertir a la aplicación) ¿Cómo es esto factible? Encontré muy poca documentación sobre esta lib, y ninguna de ellas se refería a esta funcionalidad en particular. Gracias.Usando ServerManager para crear una aplicación dentro de la aplicación
Respuesta
La forma de hacerlo es manipular la colección Site.Applications
que es un árbol aplanado de todas las aplicaciones de su sitio.
Por el bien de estos ejemplos asumiremos un sitio llamado "MySite" donde el contenido se encuentra en el disco duro local en: d:\mysite\www
. El número IIS del sitio es 3
y el sitio reside en su propio grupo de aplicaciones también llamado "MySite".
También asumiremos la siguiente estructura de carpetas para el sitio
Para empezar tenemos el sitio que queremos añadir una aplicación a, usaremos la variable a lo largo site
:
// Get my site
Site site = serverManager.Sites.First(s => s.Id == 3);
La raíz "/" aplicación:
Cada sitio tiene una aplicación "raíz". Si abrimos applicationHost.config
situado en %systemroot%\windows\system32\inetsrv\config
y localizar el nodo <site>
para nuestro sitio vemos lo siguiente:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\mysite\www" />
</application>
</site>
Cada <site>
contiene una colección de <application>
's. Siempre habrá al menos una aplicación que define la aplicación raíz, /
.
El atributo applicationPool
especifica qué grupo de aplicaciones usar.
Tenga en cuenta que hay un solo elemento secundario: virtualDirectory
.
Cada application
tiene una colección secundaria de virtualDirectory
elementos y generalmente habrá al menos un elemento en esta colección.
El valor predeterminado <virtualDirectory>
dentro de la aplicación de la raíz nos dice:
- esta es la raíz (
path="/"
) y - que está ubicado físicamente en el sistema de archivos en
d:\MySite\www
(physicalPath="d:\MySite\www"
).
El path
de cada virtualDirectory
es relativa a la path
especificado en el application
ruta padre.
Adición de un directorio virtual:
Si quisiéramos añadir un directorio virtual a la "raíz del sitio" asignada a otro lugar en el sistema de archivos que nos gustaría hacer:
Application rootApp = site.Applications.First(a => a.Path == "/");
rootApp.VirtualDirectories.Add("/vdir_1", @"D:\MySite\other_content");
serverManager.CommitChanges();
La resultante la configuración será similar a:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
</application>
</site>
y vemos esto en el Administrador de IIS:
Adición de un directorio virtual a un directorio virtual existente:
Si quisiéramos añadir un directorio virtual niño a vdir1
que nos gustaría hacer:
root.VirtualDirectories.Add("/vdir_1/sub_dir1", @"d:\MySite\more_content");
esto se traduce en :
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
</application>
</site>
Administrador de IIS:
Hay un par de cosas a tener en cuenta a la hora de añadir directorios virtuales:
- Como se ha mencionado, lo virtual
path
es siempre relativa a la solicitud principalpath
- El última parte de un
path
virtual, por ejemplo/vdir_1
y.../sub_dir1
se convierte en el nombre del directorio virtual - Es perfectamente legal tener más de un punto directorio virtual a la misma carpeta física
- Con la excepción de la parte del nombre de ruta de un directorio virtual, todas las partes de la ruta debería existir como rutas físicas o como rutas virtuales dentro de la raíz del sitio web (
d:\MySite\www
). es decir,path
debería poder superponer algo que ya está allí; de lo contrario, un directorio virtual no estará visible en el administrador de IIS.
En cuanto a este último punto, por ejemplo, no tenemos una carpeta física o directorio virtual llamado /vdir_2
pero el siguiente código es perfectamente legal:
root.VirtualDirectories.Add("/vdir_2/sub_dir1", @"d:\MySite\even_more_content");
No verá /vdir_2/sub_dir1
apareces en el administrador de IIS, pero es legal y puede buscarlo. También podemos verlo en applicationHost.config
: Carpeta
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
</site>
Convertir a la aplicación:
Si acaba de cargar un ASP.NET a la carpeta /app_1
en su sitio y desea convertir esto en su propia aplicación hacemos esto:
Application app = site.Applications.Add("/app_1", @"d:\MySite\www\app_1");
// set application pool, otherwise it'll run in DefaultAppPool
app.ApplicationPoolName = "MySite";
serverManager.CommitChanges();
En applicationHost.config
podemos ver un nuevo <application>
elemento ha sido añadido:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
</application>
</site>
en IIS vemos:
Esto es el equivalente de hacer clic derecho en "Co nvertir a la aplicación ".
Agregar una aplicación a otra existente:
Adición de una aplicación como un hijo de una aplicación existente es muy simple. Decimos que queremos hacer /app_1/sub_app_1
una aplicación secundaria de /app_1
:
Nos sería simplemente hacer:
Application app =
site.Applications.Add("/app_1/sub_app_1", @"d:\mysite\www\app_1\sub_app_1");
app.ApplicationPoolName ="MySite";
La configuración resultante se vería así:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
</application>
<application path="/app_1/sub_app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\mysite\www\app_1\sub_app_1" />
</application>
</site>
En IIS:
Agregar directorio virtual de aplicación:
Ahora bien, si queremos añadir un directorio virtual para esta aplicación haríamos:
Application app = site.Applications.First(a => a.Path == "/app_1");
app.VirtualDirectories.Add("/vdir_1", @"d:\MySite\other_content");
En applicationHost.config
podemos ver un nuevo <virtualDirectory>
elemento tiene sido agregados:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
<virtualDirectory path="/vdir_1" physicalPath="d:\MySite\other_content" />
</application>
</site>
En IIS vemos:
vez más, es importante tener en cuenta que la ruta de acceso virtual /vdir1
siempre es relativa a la ruta de la aplicación que contiene.
Convertir existente directorio virtual de aplicación:
¿Y si quisiéramos convertir el directorio virtual que acabamos de crear (/app_1/vdir1
) a una aplicación?Tendríamos que hacer esto en dos pasos:
// Get the application
Application app_1 = site.Applications.First(a => a.Path == "/app_1");
// Find the virtual directory
VirtualDirectory vdir_1 = app_1.VirtualDirectories.First(v => v.Path == "/vdir_1");
// Remove it from app_1
app_1.VirtualDirectories.Remove(vdir_1);
// Create our application
Application vdir_1_app = site.Applications.Add("/app_1/vdir_1", vdir_1.PhysicalPath);
// set application pool, otherwise it'll run in DefaultAppPool
vdir_1_app.ApplicationPoolName = "MySite";
serverManager.CommitChanges();
La resultante applicationHost.config
parece:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
</application>
<application path="/app_1/vdir_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\other_content" />
</application>
</site>
En el Administrador de IIS que vemos:
Añadir aplicación al Directorio virtual existente:
¿Qué sucede si queremos agregar una aplicación a un directorio virtual, cómo funciona eso? En este ejemplo agregaremos una aplicación al directorio virtual /vdir_1/sub_dir1
que creamos anteriormente.
Application app =
site.Applications.Add("/vdir_1/sub_dir1/app_2", @"d:\mysite\other_content");
app.ApplicationPoolName = "MySite";
serverManager.CommitChanges();
La configuración resultante se parece a:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
</application>
<application path="/app_1/vdir_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\other_content" />
</application>
<application path="/vdir_1/sub_dir1/app_2" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\mysite\other_content" />
</application>
</site>
Y en el administrador de IIS que vemos:
Convertir carpeta secundaria existente en una aplicación:
Como un último ejemplo, queremos convertir /other_apps/sub_app_1
a una aplicación:
Nuestro código es el siguiente:
Application app =
site.Applications.Add("/other_apps/sub_app_1", @"d:\mysite\other_content");
app.ApplicationPoolName="MySite";
serverManager.CommitChanges();
La configuración resultante:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
</application>
<application path="/app_1/vdir_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\other_content" />
</application>
<application path="/vdir_1/sub_dir1/app_2" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\mysite\other_content" />
</application>
<application path="/other_apps/sub_app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\mysite\other_content" />
</application>
</site>
En el Administrador de IIS:
Espero que esto ayude a explicar la relación entre los sitios, las aplicaciones y los directorios virtuales.
- 1. crear ejecutable para la aplicación usando opencv?
- 2. Crear macro soporte de automatización dentro de una aplicación
- 3. Configure los ajustes de autenticación IIS utilizando la clase ServerManager
- 4. Crear un instalador para la aplicación Linux
- 5. Crear archivo PDF/Word (doc) dentro de la aplicación
- 6. Crear una aplicación plist
- 7. Crear una aplicación para iPhone sin Xcode
- 8. D3 dentro de una aplicación AngularJS
- 9. Usando Silverlight Controls dentro de la aplicación WPF
- 10. Escribir una consola dentro de una aplicación
- 11. ¿Es posible crear una aplicación para la plataforma de LinkedIn?
- 12. Cómo crear una aplicación de Android usando HTML 5
- 13. fork dentro de la aplicación Cocoa
- 14. usando osgi para desarrollar una aplicación
- 15. ¿Cómo crear una aplicación SaaS?
- 16. Cerrar una aplicación usando WiX
- 17. Cómo crear una aplicación de barra de menú para Mac
- 18. ¿Cómo crear una aplicación para la tienda Cydia?
- 19. Hipervínculos dentro del texto "sobre" para la aplicación de iphone
- 20. Subdirectorios dentro de una aplicación de iOS
- 21. Uso de Maven para crear una aplicación Java Web Start
- 22. Incluyendo IIS dentro de una aplicación
- 23. Guardar contraseñas dentro de una aplicación
- 24. Usando Python para desarrollar la aplicación web
- 25. Muestra Settings.bundle Root.plist en una vista dentro de la aplicación
- 26. crear la aplicación .NET en Jenkins usando MSBuild
- 27. pyGame dentro de una aplicación pyGTK
- 28. Forzar la vista web para abrir las URL dentro de la aplicación - aplicación de Android
- 29. Administrar sesión dentro de la aplicación distribuida
- 30. ¿Cómo puedo integrar LinkedIn dentro de una aplicación de iPhone?
Gran respuesta Kev. +1 –
@mike - aplausos Mike. :) – Kev
Impresionante, gracias @Kev. Una mención, bajo las instrucciones de Convertir a la aplicación, uno de mis instaladores estaba creando el subdirectorio como un VDir en lugar de un directorio normal, así que cuando ejecuté ese código para convertirlo en una aplicación, me dio un "directorio que ya existe". La solución fue simplemente llamar a la API para eliminar el VDir existente de la colección VirtualDirectories si existía antes de agregar la aplicación. Artículo pequeño, pero puede valer la pena incluirlo en sus instrucciones. –