Evite a herança web.config no aplicativo Web filho usando herditInChildApplications

153

Estou tentando adicionar

<location inheritInChildApplications="false">

ao web.config do meu aplicativo Web pai, mas ele não parece estar funcionando.

Os meus pais web.configtêm:

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

Meu aplicativo Web filho é configurado como um aplicativo no IIS e é herdado dos pais, o web.configque está causando problemas.

Onde exatamente devo colocar o

<location inheritInChildApplications="false">

então ele ignora todas as várias configurações do web.config?

Blankman
fonte

Respostas:

203

Como os comentaristas da resposta anterior mencionaram, você não pode simplesmente adicionar a linha ...

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

... logo abaixo <configuration>. Em vez disso, você precisa agrupar as seções web.config individuais para as quais deseja desativar a herança. Por exemplo:

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

Embora <clear />possa funcionar para algumas seções de configuração, há algumas que exigem uma <remove name="...">diretiva e outras ainda não parecem dar suporte. Nessas situações, provavelmente é apropriado definir inheritInChildApplications="false".

Nick Cecil
fonte
11
É possível fazer o contrário? Acho estranho precisar atualizar o pai, quando é o filho que decide se as configurações devem ser herdadas ou não.
Nabeelfarid
@nabeelfarid - concordo plenamente. Se você tem um blog wordpress dentro de um aplicativo .NET com um complexo web.config, pode ser uma grande dor lidar com a limpeza ou a prevenção de herança. Eu acho que o sistema inteiro 'localização' é projetado mais em torno da segurança para hosts compartilhados que para os problemas de compatibilidade a maioria das pessoas estão encontrando-se aqui para
Simon_Weaver
Isso não funciona para mim? Alguma ideia? Eu tenho um serviço wcf que possui configuração pai definida como conexão de banco de dados SIT. Eu tenho outra pasta no mesmo serviço que diz "QA" e contém os mesmos arquivos de serviço WCF do SIT, incluindo o web.config, mas apontando o banco de dados para o controle de qualidade. Quando ligo para o serviço wcf dentro da pasta "QA", ele usa a conexão apenas da configuração pai (até eu dou a tag <location>). Por favor, deixe-me saber qual seria o problema.
Superachu
@NickCecil, como faço para conseguir isso no IIS 6? inheritInChildApplicationsnão está sendo aceito como um parâmetro válido para o <location />elemento Meu site está executando o SharePoint (2007). Criei um aplicativo em um diretório virtual neste site, gerenciado por seu próprio pool de aplicativos. No entanto, estou enfrentando conflitos entre a configuração do SharePoint e esse aplicativo. Veja esta pergunta que eu publiquei no Server Fault.
Usuário da Web
1
Meu aplicativo que eu criei como filho de um site ainda deseja carregar as DLLs do site pai. Aparentemente, eu não posso usar <location>para tempo de execução ...
Francis Ducharme
65

Ele precisa ir diretamente sob o <configuration>nó raiz e você precisa definir um caminho como este:

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

Uma maneira melhor de lidar com a herança de configuração é usar um <clear/>na configuração filho sempre que você não quiser herdar. Portanto, se você não quisesse herdar as seqüências de conexão da configuração pai, faria algo assim:

<?xml version="1.0"?>
<configuration>
    <connectionStrings>
        <clear/>
        <!-- Child config's connection strings -->
    </connectionStrings>
</configuration>
Andrew Hare
fonte
17
Eu recebo este erro "A seção de configuração 'configSections' não pode ser lida porque está faltando uma declaração de seção" no arquivo web.config dos meus pais.
23909 Blankman
Você pode postar sua configuração com o elemento <location>? Também verificaria minha edição e veria se <clear /> pode ser uma abordagem melhor para o que você está tentando fazer.
23711 Andrew Hare
6
não funciona quando você o coloca em <configuração>. Você pode quebrar, digamos o nó <system.web>, mas você não pode simplesmente colocá-lo na raiz dessa maneira.
PositiveGuy
Se você colocá-lo em <configuração> como o segundo nó, você obtém "o atributo herditInChildApplications não é declarado". Portanto, não é um atributo válido nesse nível no web.config. Então, como você pode dizer que isso funcionou?
PositiveGuy
12
-1: também posso confirmar que o uso do elemento location, como mostrado acima, NÃO funciona.
Adrian Grigore
23

Eu coloquei tudo em:

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

exceto: <configSections/>, <connectionStrings/>e <runtime/>.

Existem alguns casos em que não queremos herdar algumas secções <configSections />, mas não podemos colocar <section/>tags <location/>, portanto precisamos criar um <secionGroup />e colocar nossas seções indesejadas nesse grupo. Grupos de seção podem ser posteriormente inseridos em uma tag de localização.

Então, temos que mudar isso:

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

Para dentro:

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

<location path="." inheritInChildApplications="false">
    <myNotInheritedSections>
        <unwantedSection />
    </myNotInheritedSections>
</location>
Cryss
fonte
Eu tenho seções personalizadas
Kiquenet
Isso resolveu meu problema. Eu tinha um aplicativo Web com EF6.1.3 e um aplicativo Web filho com EF5. A atualização do aplicativo Web filho estava fora de questão, então eu tive que usar essa técnica para fazer o trabalho funcionar. Eu segui este exemplo, mudando myNotInheritedSectionspara ef6Privatee unwantedSectioné a entityFrameworkseção
Mohamed Nuur
Você pode ajudar por que o meu não está funcionando? Aqui está o meu 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
9

Estávamos recebendo um erro relacionado a isso após um recente lançamento de código em um de nossos ambientes de desenvolvimento. Temos um aplicativo que é filho de outro aplicativo. Esse relacionamento tem funcionado bem por YEARS até ontem.

O problema:
estávamos recebendo um erro de rastreamento de pilha amarelo devido à inserção de chaves duplicadas. Isso ocorre porque o web.config para os aplicativos filho e pai tinha essa chave. Mas isso existiu por muitos anos como esse sem mudanças. Por que de repente é um problema agora?

A solução:
A razão pela qual isso nunca foi um problema é porque as chaves E os valores sempre foram os mesmos. Ontem, atualizamos nossas cadeias de conexão SQL para incluir o Nome do Aplicativo na cadeia de conexão. Isso tornou a string única e, de repente, começou a falhar.

Sem fazer nenhuma pesquisa sobre o motivo exato disso, devo assumir que, quando o aplicativo filho herda os valores web.config dos pais, ele ignora pares de chave / valor idênticos.

Conseguimos resolvê-lo envolvendo a cadeia de conexão como esta

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

Edit: Eu esqueci de mencionar que eu adicionei isso no web.config dos PAIS. Não precisei modificar o web.config da criança.

Obrigado por todos ajudarem nisso, salvou nossos traseiros.

Kenneth Garza
fonte
6

Se (como eu entendo) você estiver tentando bloquear completamente a herança na configuração da Web do seu aplicativo filho, sugiro que você evite usar a tag no web.config. Em vez disso, crie um novo apppool e edite o arquivo applicationHost.config (localizado em% WINDIR% \ System32 \ inetsrv \ Config e% WINDIR% \ SysWOW64 \ inetsrv \ config). Você apenas precisa encontrar a entrada para o seu pool de aplicativos e adicionar o atributo enableConfigurationOverride="false"como no exemplo a seguir:

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

Isso evitará a herança de configuração nos aplicativos servidos pelo MyAppPool.

Matteo

Matteo Sganzetta
fonte
1
O MSDN diz 'Quando falso, todas as configurações nos arquivos Web.config serão ignoradas para esse pool de aplicativos' e isso simplesmente não parece o que você pensa que significa. Eu adoraria que isso seja a resposta certa, mas eu simplesmente não posso fazê-lo work.It quase parece-me que isso significa marcar 'impedir completamente um web.config local para esta apppool'
Simon_Weaver
Então, basicamente, os aplicativos nesse pool de aplicativos devem funcionar sem um arquivo web.config? Eu entendo que o "web.config ignorado" é aquele na pasta raiz. Eu usei algumas vezes com sucesso. Verifique se o aplicativo filho não depende das configurações no web.config raiz (tente executar o aplicativo filho em uma pasta raiz separada).
Matteo Sganzetta
1
Você também pode verificar o método # 2 nesta página, embora eu não testei iislogs.com/steveschofield/2009/09/20/...
Matteo Sganzetta
meu aplicativo filho é na verdade uma cópia exata do aplicativo pai. Eu quero poder colocar /previewpara que as pessoas possam testar uma nova versão antes de torná-la ativa. Todo mundo sempre sugere <location>para corrigir esse problema, então fiquei muito empolgado ao ler sua postagem. No entanto, se queixa The entry 'default' has already been added.de uma entrada de configuração relacionada AppFabric mesmo quando eu usoenableConfigurationOverride="false"
Simon_Weaver
Além disso, se eu definir enableConfigurationOverride="false"no meu aplicativo raiz, ele mata completamente o aplicativo raiz e nem funciona :-(
Simon_Weaver
1

Estamos recebendo erros sobre diretivas de configuração duplicadas em um de nossos aplicativos. Após a investigação, parece que é por causa desse problema .

Em resumo, nosso site raiz é o ASP.NET 3.5 (que é 2.0 com bibliotecas específicas adicionadas) e temos um subaplicativo que é o ASP.NET 4.0.

A herança web.config faz com que o sub-aplicativo ASP.NET 4.0 herde o arquivo web.config do aplicativo ASP.NET 3.5 pai.

No entanto, o web.config global (ou "raiz") do aplicativo ASP.NET 4.0, que reside em C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.config e C: \ Windows \ Microsoft. NET \ Framework64 \ v4.0.30319 \ Config \ web.config (dependendo da sua testemunha), já contém essas seções de configuração.

O aplicativo ASP.NET 4.0 tenta mesclar o ASP.NET 4.0 web.config raiz e o web.config pai (o de um aplicativo ASP.NET 3.5) e executa duplicatas no nó.

A única solução que consegui encontrar é remover as seções de configuração do web.config pai e, em seguida,

  1. Determine que você não precisa deles no aplicativo raiz ou se precisa
  2. Atualize o aplicativo pai para o ASP.NET 4.0 (para obter acesso às configurações de raiz do web.config)
Josh
fonte