Évitez l'héritage web.config dans l'application Web enfant à l'aide de inheritInChildApplications

153

J'essaye d'ajouter

<location inheritInChildApplications="false">

au web.config de mon application Web parente, mais cela ne semble pas fonctionner.

Mes parents web.configont:

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

Mon application Web enfant est configurée en tant qu'application dans IIS et hérite de celle du parent, web.configce qui pose des problèmes.

Où dois-je placer exactement le

<location inheritInChildApplications="false">

donc il ignore tous les différents paramètres web.config?

Blankman
la source

Réponses:

203

Comme l'ont mentionné les commentateurs de la réponse précédente, vous ne pouvez pas simplement ajouter la ligne ...

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

... juste en dessous <configuration>. Au lieu de cela, vous devez encapsuler les sections web.config individuelles pour lesquelles vous souhaitez désactiver l'héritage. Par exemple:

<!-- 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>

Bien que cela <clear />puisse fonctionner pour certaines sections de configuration, il y en a qui nécessitent à la place une <remove name="...">directive, et d'autres encore ne semblent pas prendre en charge non plus. Dans ces situations, il est probablement approprié de définir inheritInChildApplications="false".

Nick Cecil
la source
11
Est-il possible de faire l'inverse? Je trouve étrange que je doive mettre à jour le parent, quand c'est l'enfant qui décide si les paramètres doivent être hérités ou non.
nabeelfarid
@nabeelfarid - Je suis entièrement d'accord. Si vous avez un blog wordpress dans une application .NET avec un web.config complexe, il peut être très difficile de l'effacer ou d'empêcher l'héritage. Je pense que tout le système de `` localisation '' est davantage conçu autour de la sécurité pour les hôtes partagés que pour les problèmes de compatibilité, la plupart des gens se retrouvent ici
Simon_Weaver
Cela ne fonctionne pas pour moi? Des pensées? J'ai un service wcf dont la configuration parent est définie sur la connexion à la base de données SIT. J'ai un autre dossier dans le même service qui dit "QA" et il contient les mêmes fichiers de service WCF que dans SIT, y compris le web.config mais pointant la base de données vers QA. Lorsque j'appelle le service wcf dans le dossier "QA", il prend la connexion de la configuration parent uniquement (même si je donne la balise <location>). Veuillez me faire savoir quel serait le problème.
superachu
@NickCecil comment puis-je y parvenir dans IIS 6? inheritInChildApplicationsn'est pas accepté comme paramètre valide pour l' <location />élément. Mon site Web utilise SharePoint (2007). J'ai créé une application dans un répertoire virtuel sous ce site Web, géré par son propre pool d'applications. Pourtant, je rencontre des conflits entre la configuration de SharePoint et cette application. Voir cette question que j'ai postée dans Server Fault.
Utilisateur Web
1
Mon application que j'ai créée en tant qu'enfant d'un site Web souhaite toujours charger les DLL à partir du site Web parent. Apparemment, je ne peux pas utiliser <location>pour l'exécution ...
Francis Ducharme
65

Il doit aller directement sous le <configuration>nœud racine et vous devez définir un chemin comme celui-ci:

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

Une meilleure façon de gérer l'héritage de configuration est d'utiliser a <clear/>dans la configuration enfant là où vous ne voulez pas hériter. Donc, si vous ne vouliez pas hériter des chaînes de connexion de la configuration parent, vous feriez quelque chose comme ceci:

<?xml version="1.0"?>
<configuration>
    <connectionStrings>
        <clear/>
        <!-- Child config's connection strings -->
    </connectionStrings>
</configuration>
Andrew Hare
la source
17
J'obtiens cette erreur "La section de configuration 'configSections' ne peut pas être lue car il manque une déclaration de section" dans le fichier web.config de mes parents.
Blankman
Pouvez-vous publier votre configuration avec l'élément <location>? Je vérifierais également mon édition et verrais si <clear /> pourrait être une meilleure approche pour ce que vous essayez de faire.
Andrew Hare
6
cela ne fonctionne pas lorsque vous le mettez directement sous <configuration>. Vous pouvez envelopper, disons le nœud <system.web>, mais vous ne pouvez pas simplement le mettre à la racine comme ceci.
PositiveGuy
Si vous le placez sous <configuration> en tant que 2ème nœud, vous obtenez "L'attribut inheritInChildApplications n'est pas déclaré". Ce n'est donc pas un attribut valide à ce niveau dans le web.config. Alors, comment pouvez-vous dire que cela a fonctionné?
PositiveGuy
12
-1: Je peux également confirmer que l'utilisation de l'élément d'emplacement comme indiqué ci-dessus ne fonctionne PAS.
Adrian Grigore
23

J'ai tout mis dans:

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

sauf: <configSections/>, <connectionStrings/>et <runtime/>.

Il y a des cas où nous ne voulons pas hériter de certaines sections <configSections />, mais nous ne pouvons pas y insérer de <section/>balise <location/>, nous devons donc créer un <secionGroup />et placer nos sections indésirables dans ce groupe. Les groupes de sections peuvent être insérés ultérieurement dans une balise d'emplacement.

Nous devons donc changer cela:

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

Dans:

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

<location path="." inheritInChildApplications="false">
    <myNotInheritedSections>
        <unwantedSection />
    </myNotInheritedSections>
</location>
cryss
la source
J'ai des sections personnalisées
Kiquenet
Cela a résolu mon problème. J'avais une application Web avec EF6.1.3 et une application Web enfant avec EF5. La mise à niveau de l'application Web enfant était hors de question, j'ai donc dû utiliser cette technique pour que les deux fonctionnent et cela a fonctionné. J'ai suivi cet exemple, en changeant myNotInheritedSectionspour ef6Privateet unwantedSectionest la entityFrameworksection.
Mohamed Nuur
Pouvez-vous expliquer pourquoi le mien ne fonctionne pas, voici mon code <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
9

Nous recevions une erreur liée à cela après une récente publication de code dans l'un de nos environnements de développement. Nous avons une application qui est un enfant d'une autre application. Cette relation fonctionne bien depuis des années jusqu'à hier.

Le problème:
nous recevions une erreur de trace de pile jaune en raison de la saisie de clés en double. Cela est dû au fait que le web.config des applications enfant et parent avait cette clé. Mais cela a existé pendant de nombreuses années comme ça sans changement. Pourquoi tout d'un coup c'est un problème maintenant?

La solution:
la raison pour laquelle cela n'a jamais été un problème est que les clés ET les valeurs étaient toujours les mêmes. Hier, nous avons mis à jour nos chaînes de connexion SQL pour inclure le nom de l'application dans la chaîne de connexion. Cela a rendu la chaîne unique et a soudainement commencé à échouer.

Sans faire aucune recherche sur la raison exacte de cela, je dois supposer que lorsque l'application enfant hérite des valeurs web.config des parents, elle ignore les paires clé / valeur identiques.

Nous avons pu le résoudre en enveloppant la chaîne de connexion comme ceci

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

Edit: j'ai oublié de mentionner que j'ai ajouté ceci dans le web.config de PARENTS. Je n'ai pas eu à modifier le web.config de l'enfant.

Merci pour l'aide de tout le monde à ce sujet, nous avons sauvé nos fesses.

Kenneth Garza
la source
6

Si (si je comprends bien) vous essayez de bloquer complètement l'héritage dans la configuration Web de votre application enfant, je vous suggère d'éviter d'utiliser la balise dans web.config. Créez plutôt un nouveau pool d'applications et modifiez le fichier applicationHost.config (situé dans% WINDIR% \ System32 \ inetsrv \ Config et% WINDIR% \ SysWOW64 \ inetsrv \ config). Il vous suffit de trouver l'entrée de votre apppool et d'ajouter l'attribut enableConfigurationOverride="false"comme dans l'exemple suivant:

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

Cela évitera l'héritage de configuration dans les applications servies par MyAppPool.

Matteo

Matteo Sganzetta
la source
1
MSDN dit: «Lorsqu'il est faux, tous les paramètres des fichiers Web.config seront ignorés pour ce pool d'applications» et cela ne ressemble tout simplement pas à ce que vous pensez que cela signifie. J'adorerais que ce soit la bonne réponse mais je n'arrive tout simplement pas à la faire fonctionner.Il me semble presque que ce paramètre signifie `` interdire complètement un web.config local pour ce pool d'applications ''
Simon_Weaver
Donc, fondamentalement, les applications de ce pool d'applications sont censées fonctionner sans fichier web.config? Je comprends que le "web.config ignoré" est celui du dossier racine. Je l'ai utilisé quelques fois avec succès. Assurez-vous que l'application enfant ne dépend pas des configurations dans le web.config racine (essayez d'exécuter l'application enfant dans un dossier racine distinct).
Matteo Sganzetta
1
Vous pouvez également vérifier la méthode n ° 2 sur cette page, même si je ne l'ai pas testée iislogs.com/steveschofield/2009/09/20/…
Matteo Sganzetta
ma demande enfant est en fait une copie exacte de la demande parent. Je veux pouvoir mettre /previewles gens à l'essai une nouvelle version avant de la mettre en ligne. Tout le monde suggère toujours <location>de résoudre ce problème, j'étais donc très heureux de lire votre message. Cependant, il se plaint The entry 'default' has already been added.d'une entrée de configuration liée à AppFabric même lorsque j'utiliseenableConfigurationOverride="false"
Simon_Weaver
aussi si je définis enableConfigurationOverride="false"sur mon application racine, cela tue complètement l'application racine et cela ne fonctionnera même pas :-(
Simon_Weaver
1

Nous obtenons des erreurs concernant les directives de configuration en double sur l'une de nos applications. Après enquête, il semble que ce soit à cause de ce problème .

En bref, notre site Web racine est ASP.NET 3.5 (qui est 2.0 avec des bibliothèques spécifiques ajoutées), et nous avons une sous-application qui est ASP.NET 4.0.

L'héritage web.config oblige la sous-application ASP.NET 4.0 à hériter du fichier web.config de l'application ASP.NET 3.5 parente.

Cependant, web.config global (ou "racine") de l'application ASP.NET 4.0, qui réside dans C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.config et C: \ Windows \ Microsoft. NET \ Framework64 \ v4.0.30319 \ Config \ web.config (en fonction de votre bitness), contient déjà ces sections de configuration.

L'application ASP.NET 4.0 essaie ensuite de fusionner le web.config ASP.NET 4.0 racine et le web.config parent (celui d'une application ASP.NET 3.5) et s'exécute en doublons dans le nœud.

La seule solution que j'ai pu trouver est de supprimer les sections de configuration du web.config parent, puis soit

  1. Déterminez que vous n'en aviez pas besoin dans votre application racine, ou si vous en avez besoin
  2. Mettez à niveau l'application parente vers ASP.NET 4.0 (afin qu'elle ait accès aux configSections de la racine web.config)
Josh
la source