proyectos - que aplicaciones se pueden hacer con c#
Usando ServerManager para crear aplicaciones dentro de la aplicaciĆ³n (1)
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 right- haga clic en -> 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.
La forma de hacerlo es manipular la colección Site.Applications
, que es un árbol plano de todas las aplicaciones en 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 al que queremos agregar una aplicación, usaremos el site
variable a lo largo de:
// Get my site
Site site = serverManager.Sites.First(s => s.Id == 3);
La raíz de la aplicación "/":
Cada sitio tiene una aplicación "raíz". Si abrimos applicationHost.config
ubicado en %systemroot%/windows/system32/inetsrv/config
y buscamos 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>
. 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 único elemento secundario: virtualDirectory
.
Cada application
tiene una colección virtualDirectory
elementos de virtualDirectory
y normalmente habrá al menos un elemento en esta colección.
El <virtualDirectory>
predeterminado en la aplicación raíz nos dice:
- esta es la raíz (
path="/"
) y - que está físicamente ubicado en el sistema de archivos en
d:/MySite/www
(physicalPath="d:/MySite/www"
).
La path
de cada virtualDirectory
es relativa a la path
especificada en la ruta de la application
principal.
Agregar un directorio virtual:
Si quisiéramos agregar un directorio virtual a la "raíz del sitio" asignada a otro lugar en el sistema de archivos, lo haríamos:
Application rootApp = site.Applications.First(a => a.Path == "/");
rootApp.VirtualDirectories.Add("/vdir_1", @"D:/MySite/other_content");
serverManager.CommitChanges();
La configuración resultante se ve 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" />
</application>
</site>
Y vemos esto en el Administrador de IIS:
Agregar un directorio virtual a un directorio virtual existente:
Si quisiéramos agregar un directorio virtual hijo a vdir1
, lo haríamos:
root.VirtualDirectories.Add("/vdir_1/sub_dir1", @"d:/MySite/more_content");
esto resulta 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 algunas cosas a tener en cuenta al agregar directorios virtuales:
- Como se mencionó, la
path
virtual siempre es relativa a lapath
aplicación principal - La última parte de una
path
virtualpath
por ejemplo/vdir_1
y.../sub_dir1
convierte en el nombre del directorio virtual - Es perfectamente legal tener más de un punto de directorio virtual en la misma carpeta física
- Con la excepción del nombre parte de una ruta de directorio virtual, todas las partes de la ruta deben existir como rutas físicas o como rutas virtuales dentro de la raíz del sitio web (
d:/MySite/www
). es decir, lapath
debería poder superponer algo que ya está allí; de lo contrario, un directorio virtual no será visible en el administrador de IIS.
Con respecto a ese ú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
aparecer en el administrador de IIS, pero es legal y puede /vdir_2/sub_dir1
. También podemos verlo en applicationHost.config
:
<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 carpeta en aplicación:
Si acabas de subir una aplicación ASP.NET a la carpeta /app_1
en tu sitio y quieres 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 que se ha agregado un nuevo elemento <application>
:
<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 equivalente a hacer clic derecho en "Convertir a aplicación".
Agregar aplicación a la aplicación existente:
Agregar una aplicación como hija de una aplicación existente es muy simple. Digamos que queremos hacer /app_1/sub_app_1
una sub aplicación de /app_1
:
Simplemente lo haríamos:
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 a la aplicación:
Ahora, si quisiéramos agregar un directorio virtual a esta aplicación, lo 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 que se ha agregado un nuevo elemento <virtualDirectory>
:
<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:
De nuevo, es importante tener en cuenta que la ruta virtual /vdir1
siempre es relativa a la ruta de la aplicación que contiene.
Convierta el directorio virtual existente a la aplicación:
¿Qué pasaría 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 applicationHost.config
resultanteHost.config applicationHost.config
ve 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/vdir_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:/MySite/other_content" />
</application>
</site>
En el Administrador de IIS, vemos:
Agregar 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 ve 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/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 vemos:
Convertir carpeta infantil existente en una aplicación:
Como último ejemplo, queremos convertir /other_apps/sub_app_1
en una aplicación:
Nuestro código se ve así:
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.