tipos que pueden proyectos programas hechos hacer formularios form famosos ejemplos desarrollar con aplicaciones c# iis configuration iis-7

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 la path aplicación principal
  • La última parte de una path virtual path 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, la path 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.