Evite la herencia de web.config en la aplicación web secundaria usando la aplicación de herencia heredada.

153

Estoy tratando de agregar

<location inheritInChildApplications="false">

a la aplicación web de mi padre web.config pero no parece estar funcionando.

La de mis padres web.configtiene:

<configuration>
    <configSections>
    </configSections>

    // 10 or so custom config sections like log4net, hibernate,

    <connectionStrings>
    </connectionStrings>

    <appSettings>
    </appSettings>

    <system.diagnostics>
    </system.diagnostics>

    <system.web>
         <webParts>
         </webParts>
         <membership>
         </membership>

         <compilation>
         </compilation>
    </system.web>

    <location ..>
    <system.web>
        </system.web>
    </location>

    <system.webServer>
    </system.webServer>

La aplicación web de mi hijo está configurada como una aplicación en IIS y hereda de la de los padres, lo web.configque está causando problemas.

¿Dónde exactamente debo colocar el

<location inheritInChildApplications="false">

entonces ignora todas las configuraciones de web.config?

Blankman
fuente

Respuestas:

203

Como mencionaron los comentaristas de la respuesta anterior, no puede simplemente agregar la línea ...

<location path="." inheritInChildApplications="false">

... justo debajo <configuration>. En su lugar, debe ajustar las secciones web.config individuales para las que desea deshabilitar la herencia. Por ejemplo:

<!-- disable inheritance for the connectionStrings section -->
<location path="." inheritInChildApplications="false">
   <connectionStrings>
   </connectionStrings>
</location>

<!-- leave inheritance enabled for appSettings -->
<appSettings>
</appSettings>

<!-- disable inheritance for the system.web section -->
<location path="." inheritInChildApplications="false">
   <system.web>
        <webParts>
        </webParts>
        <membership>
        </membership>

        <compilation>
        </compilation>
      </system.web>
 </location>

Si bien <clear />puede funcionar para algunas secciones de configuración, hay algunas que requieren una <remove name="...">directiva, y otras parecen no ser compatibles. En estas situaciones, probablemente sea apropiado configurarlo inheritInChildApplications="false".

Nick Cecil
fuente
11
¿Es posible hacerlo al revés? Me resulta extraño que tenga que actualizar al padre, cuando es el niño quien decide si la configuración debe heredarse o no.
nabeelfarid
@nabeelfarid - Estoy completamente de acuerdo. Si tiene un blog de wordpress dentro de una aplicación .NET con una configuración web.config compleja, puede ser un gran problema tratar de borrarlo o evitar la herencia. Creo que todo el sistema de 'ubicación' está diseñado más en torno a la seguridad para hosts compartidos que para los problemas de compatibilidad por los que la mayoría de las personas se encuentran aquí
Simon_Weaver
¿Esto no funciona para mí? ¿Alguna idea? Tengo un servicio wcf que tiene la configuración principal configurada para la conexión de base de datos SIT. Tengo otra carpeta en el mismo servicio que dice "QA" y contiene los mismos archivos de servicio WCF que en SIT, incluido web.config pero apuntando la base de datos a QA. Cuando llamo al servicio wcf dentro de la carpeta "QA", solo toma la conexión desde la configuración principal (incluso le doy la etiqueta <location>). Por favor, hágame saber cuál sería el problema.
superachu
@NickCecil ¿cómo puedo lograr esto en IIS 6? inheritInChildApplicationsno se acepta como un parámetro válido para el <location />elemento. Mi sitio web ejecuta SharePoint (2007). Creé una aplicación en un directorio virtual en este sitio web, administrado por su propio grupo de aplicaciones. Sin embargo, me encuentro con conflictos entre la configuración de SharePoint y esta aplicación. Vea esta pregunta que publiqué en Server Fault.
Usuario web
1
Mi aplicación que creé como hijo de un sitio web todavía quiere cargar los archivos DLL del sitio web principal. Aparentemente, no puedo usar <location>para el tiempo de ejecución ...
Francis Ducharme
65

Debe ir directamente debajo del <configuration>nodo raíz y debe establecer una ruta como esta:

<?xml version="1.0"?>
<configuration>
    <location path="." inheritInChildApplications="false"> 
        <!-- Stuff that shouldn't be inherited goes in here -->
    </location>
</configuration>

Una mejor manera de manejar la herencia de configuración es usar una <clear/>configuración secundaria en donde no desee heredar. Entonces, si no desea heredar las cadenas de conexión de la configuración principal, haría algo como esto:

<?xml version="1.0"?>
<configuration>
    <connectionStrings>
        <clear/>
        <!-- Child config's connection strings -->
    </connectionStrings>
</configuration>
Andrew Hare
fuente
17
Recibo este error "La sección de configuración 'configSections' no se puede leer porque falta una declaración de sección" en el archivo web.config de mis padres.
Blankman
¿Puedes publicar tu configuración con el elemento <location>? También verificaría mi edición y vería si <clear /> podría ser un mejor enfoque para lo que está tratando de hacer.
Andrew Hare el
66
no funciona cuando lo coloca justo debajo de <configuración>. Puede ajustar digamos <system.web> nodo pero no puede simplemente ponerlo en la raíz de esta manera.
PositiveGuy el
Si lo coloca bajo <configuration> como el segundo nodo, obtendrá "el atributo herencia de aplicaciones no se declara". Por lo tanto, no es un atributo válido en ese nivel en web.config. Entonces, ¿cómo puedes decir que esto funcionó?
PositiveGuy el
12
-1: También puedo confirmar que usar el elemento de ubicación como se muestra arriba NO funciona.
Adrian Grigore
23

Puse todo en:

<location path="." inheritInChildApplications="false">
....
</location>

excepto: <configSections/>, <connectionStrings/>y <runtime/>.

Hay algunos casos en los que no queremos heredar algunas secciones <configSections />, pero no podemos poner <section/>etiquetas <location/>, por lo que tenemos que crear ay <secionGroup />poner nuestras secciones no deseadas en ese grupo. Los grupos de secciones se pueden insertar más tarde en una etiqueta de ubicación.

Entonces tenemos que cambiar esto:

<configSections>
  <section name="unwantedSection" />
</configSections>

Dentro:

<configSections>
  <sectionGroup name="myNotInheritedSections">
    <section name="unwantedSection" />
  </sectionGroup>
</configSections>

<location path="." inheritInChildApplications="false">
    <myNotInheritedSections>
        <unwantedSection />
    </myNotInheritedSections>
</location>
cryss
fuente
Tengo secciones personalizadas
Kiquenet
Esto resolvió mi problema. Tenía una aplicación web con EF6.1.3 y una aplicación web para niños con EF5. La actualización de la aplicación web para niños estaba fuera de discusión, así que tuve que usar esta técnica para que funcionara y funcionara. Seguí este ejemplo, cambiando myNotInheritedSectionsa ef6Privatey unwantedSectiones la entityFrameworksección.
Mohamed Nuur
¿Pueden ayudarme por qué el mío no funciona? Aquí está mi código <configSections> <sectionGroup name="ef6Private"> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <location path="." inheritInChildApplications="false"> <ef6Private> <entityFramework /> </ef6Private> </location>
asteriskdothmg el
9

Recibimos un error relacionado con esto después de una reciente publicación de código en uno de nuestros entornos de desarrollo. Tenemos una aplicación que es hija de otra aplicación. Esta relación ha estado funcionando bien durante AÑOS hasta ayer.

El problema:
recibimos un error de seguimiento de la pila amarilla debido a la introducción de claves duplicadas. Esto se debe a que tanto el web.config para las aplicaciones secundarias como las primarias tenían esta clave. Pero esto existió durante muchos años así sin cambios. ¿Por qué de repente es un problema ahora?

La solución:
la razón por la que esto nunca fue un problema es porque las claves Y los valores siempre fueron los mismos. Ayer actualizamos nuestras cadenas de conexión SQL para incluir el nombre de la aplicación en la cadena de conexión. Esto hizo que la cadena fuera única y de repente comenzó a fallar.

Sin hacer ninguna investigación sobre el motivo exacto de esto, debo suponer que cuando la aplicación secundaria hereda los valores web.config de los padres, ignora pares clave / valor idénticos.

Pudimos resolverlo envolviendo la cadena de conexión de esta manera

    <location path="." inheritInChildApplications="false">
        <connectionStrings>
            <!-- Updated connection strings go here -->
        </connectionStrings>
    </location>

Editar: Olvidé mencionar que agregué esto en la página web de padres. No tuve que modificar el web.config del niño.

Gracias por la ayuda de todos en esto, salvó nuestros traseros.

Kenneth Garza
fuente
6

Si (según tengo entendido) está intentando bloquear completamente la herencia en la configuración web de su aplicación secundaria, le sugiero que evite usar la etiqueta en web.config. En su lugar, cree un nuevo grupo de aplicaciones y edite el archivo applicationHost.config (ubicado en% WINDIR% \ System32 \ inetsrv \ Config y% WINDIR% \ SysWOW64 \ inetsrv \ config). Solo tiene que encontrar la entrada para su grupo de aplicaciones y agregar el atributo enableConfigurationOverride="false"como en el siguiente ejemplo:

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

Esto evitará la herencia de configuración en las aplicaciones servidas por MyAppPool.

Matteo

Matteo Sganzetta
fuente
1
MSDN dice 'Cuando es falso, todas las configuraciones en los archivos Web.config serán ignoradas para este grupo de aplicaciones' y eso simplemente no parece lo que crees que significa. ME ENCANTARÍA que esta sea la respuesta correcta, pero no puedo hacer que funcione. Casi me parece que esta configuración significa 'no permitir completamente una web.config local para este grupo de aplicaciones'
Simon_Weaver
Entonces, ¿se supone que las aplicaciones de este grupo de aplicaciones funcionan sin un archivo web.config? Entiendo que el "ignorado web.config" es el que está en la carpeta raíz. Lo usé pocas veces con éxito. Asegúrese de que la aplicación secundaria no dependa de las configuraciones en la raíz web.config (intente ejecutar la aplicación secundaria en una carpeta raíz separada).
Matteo Sganzetta
1
También puede consultar el método # 2 en esta página, aunque no lo he probado iislogs.com/steveschofield/2009/09/20/…
Matteo Sganzetta
la solicitud de mi hijo es en realidad una copia exacta de la solicitud principal Quiero poder poner /previewpara que la gente pueda probar una nueva versión antes de ponerla en funcionamiento. Todo el mundo siempre sugiere <location>solucionar este problema, así que estaba muy emocionado de leer tu publicación. Sin embargo, se queja The entry 'default' has already been added.por una entrada de configuración relacionada con AppFabric incluso cuando usoenableConfigurationOverride="false"
Simon_Weaver
Además, si configuro enableConfigurationOverride="false"mi aplicación raíz, la elimina por completo y ni siquiera funcionará :-(
Simon_Weaver
1

Recibimos errores sobre directivas de configuración duplicadas en una de nuestras aplicaciones. Después de la investigación, parece que se debe a este problema .

En resumen, nuestro sitio web raíz es ASP.NET 3.5 (que es 2.0 con bibliotecas específicas agregadas), y tenemos una subaplicación que es ASP.NET 4.0.

La herencia web.config hace que la sub-aplicación ASP.NET 4.0 herede el archivo web.config de la aplicación ASP.NET 3.5 principal.

Sin embargo, la web.config global (o "raíz") de la aplicación ASP.NET 4.0, que reside en C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.config y C: \ Windows \ Microsoft. NET \ Framework64 \ v4.0.30319 \ Config \ web.config (dependiendo de su bitness), ya contiene estas secciones de configuración.

Luego, la aplicación ASP.NET 4.0 intenta fusionar la raíz ASP.NET 4.0 web.config y la matriz web.config (la de una aplicación ASP.NET 3.5), y se ejecuta en duplicados en el nodo.

La única solución que he podido encontrar es eliminar las secciones de configuración de la web.config principal, y luego

  1. Determine que no los necesitaba en su aplicación raíz, o si los necesita
  2. Actualice la aplicación principal a ASP.NET 4.0 (para que tenga acceso a las secciones de configuración raíz de web.config)
Josh
fuente