2010-11-10 10 views
27

Actualmente tengo 2 aplicaciones web ASP.NET 3.5 en IIS7 (llamémoslas WebParent y WebChild).'Aplicación' ASP.NET anidada dentro de IIS heredando valores de configuración padre?

WebChild está anidado en el listado de WebParent en IIS7 y está configurado como una aplicación (en lugar de solo un directorio virtual dentro de WebParent). Ambos utilizan actualmente su propio grupo de aplicaciones (clásico).

Tanto WebParent como WebChild tienen sus propios archivos web.config completamente definidos en sus propios directorios raíz.

Había asumido que viendo que WebChild se define como una 'Aplicación' dentro de IIS, que no heredaría nada del archivo de configuración de WebParent. Sin embargo, a pesar de esta configuración, estoy viendo errores relacionados con varios elementos dentro del web.config que ya están siendo definidos (que es correcto, hay un par de elementos que están en ambos archivos de configuración, pero pensé que deberían tratarse de manera completamente independiente de uno otro)?

¿Puede alguien aclarar por qué esto podría estar ocurriendo?

+0

Probablemente provienen del 'applicationHost.config'. – leppie

Respuesta

13

Si se repiten, tendrá que <remove/> luego en la aplicación secundaria web.config primero, luego agregue nuevamente el elemento que desea que sea su lugar. Esto supone que le gustaría tener un valor diferente. Si no lo haces, entonces simplemente omite el elemento. Una cadena de conexión sería un buen ejemplo de algo que es común para todas las aplicaciones, por lo que solo debe especificarlo en la raíz.

Ejemplo:

<siteMap defaultProvider="AdminSiteMapProvider" enabled="true"> 
     <providers> 
     <remove name="AdminSiteMapProvider"/> 
     <add name="AdminSiteMapProvider" description="Admin SiteMap provider" type="System.Web.XmlSiteMapProvider" siteMapFile="~/App_Data/admin.sitemap" securityTrimmingEnabled="true" /> 
     </providers> 
    </siteMap> 
+3

Veo, ¿a pesar de que el hijo se define como una Aplicación en IIS, siempre estará al tanto de la configuración de los padres? ¿Existe una regla general sobre qué elementos se pueden 'duplicar' dentro de cada web.config y qué elementos arrojarán errores (sin la solución 'eliminar' que se ha proporcionado anteriormente)? – marcusstarnes

+1

Sí, excepto en los casos en los que explícitamente se previene la herencia, como explicó Saúl a continuación.Creo que si tienes el mismo nombre en cualquier elemento obtendrás una excepción, pero tendrás que probarlo/probarlo. – ScottE

+0

Esto aún no se ocupa de las configuraciones heredadas que no se aplican a la aplicación childApp, lo que significa una TONELADA de mantenimiento. Parece que deberían haber llamado algo más parecido a "módulo" porque se está ejecutando en el contexto de otra aplicación. Parece que la única solución viable es configurar un sitio separado utilizando subdominios para proporcionar un contexto de "aplicación" adecuado. – rainabba

-1

el consejo de Seguimiento Scott y también asegurarse de que usted ha hecho clic derecho WebChild en IIS y selecciona Convertir a la aplicación.

+0

El elemento secundario ya está definido como una aplicación dentro de IIS y, como resultado, esa opción no está disponible. – marcusstarnes

54

La solución exacta a su problema dependerá del mensaje de excepción de configuración que esté viendo. Sin embargo, este es un problema típico que a menudo se puede resolver mediante el uso del atributo inheritInChildApplications en el elemento de ubicación en el web.config para "WebParent". Envolviendo toda la sección system.web en un elemento de ubicación de la siguiente manera, usted debería ser capaz de eliminar el problema que describes:

<location path="." inheritInChildApplications="false"> 
    <system.web> 
    <!-- ... --> 
    </system.web> 
</location> 

Con IIS 7, también querrá para envolver la sección de la misma system.webServer manera:

<location path="." inheritInChildApplications="false"> 
    <system.webServer> 
    <!-- ... --> 
    </system.webServer> 
</location> 

Esta solución se basa en un excelente artículo de blog que encontré here.

+1

WOW ... No sabía sobre esta etiqueta de ubicación. ¡ASP.NET es sorprendentemente poderoso! : D Recibí errores en la aplicación secundaria relacionados con un ensamblado Proveedor de funciones que no se incluyeron en la carpeta bin de la aplicación secundaria. ¡Después de aplicar esta etiqueta, todo funciona como se esperaba! : D –

+3

Esto parece un hack sucio porque tiene que colocarlo en todas partes (debería ser el comportamiento predeterminado) y agregar etiquetas que childApp podría no usar O probar la aplicación child y "arreglar" cada problema. No es una "aplicación" para mí porque no se ejecuta en su propio contexto, sino más bien como un módulo que se ejecuta dentro de una aplicación. Tiene que haber una forma mejor de hacerlo sin hospedarse en otro sitio por completo (lo que parece ser la única solución REAL). – rainabba

+2

@rainabba - Estoy de acuerdo con la sensación de hack sucio. Todavía no he encontrado una manera más elegante de aplicar la aplicación hija para ignorar el sitio web principal .config. Han pasado 3 años y he estado usando este enfoque según sea necesario (no demasiado a menudo) ... nunca se siente mejor: -/ –

2

Creo que inheritInChildApplications = "false" es bueno para casos en los que aún desee heredar parte de la configuración del elemento primario. En los casos en los que desee detener completamente la herencia (como en este caso si estoy en lo cierto), sugeriría usar 2 grupos de aplicaciones separadas para las 2 aplicaciones y luego aplicar una configuración no muy bien documentada en la aplicaciónHost.config archivo como expliqué en esta pregunta “Entry has already been added” - Two Separate App Pools

<add name="MyAppPool" autoStart="true" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" enableConfigurationOverride="false"> 
    <processModel identityType="NetworkService" /> 
</add> 
Cuestiones relacionadas