2010-12-23 20 views
33

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

93

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

alt text

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:

alt text

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:

alt text

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 principal path
  • 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:

alt text

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:

alt text

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:

alt text

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:

alt text

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:

alt text

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:

alt text

Convertir carpeta secundaria existente en una aplicación:

Como un último ejemplo, queremos convertir /other_apps/sub_app_1 a una aplicación:

alt text

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:

alt text

Espero que esto ayude a explicar la relación entre los sitios, las aplicaciones y los directorios virtuales.

+6

Gran respuesta Kev. +1 –

+0

@mike - aplausos Mike. :) – Kev

+0

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. –

Cuestiones relacionadas