İnheritInChildApplications kullanarak alt web uygulamasında web.config mirasından kaçının


153

Eklemeye çalışıyorum

<location inheritInChildApplications="false">

ana web uygulamamın web.config dosyasına bağladım, ancak çalışmıyor gibi görünüyor.

Ebeveynimin web.config:

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

Alt web uygulamam IIS'de bir uygulama olarak ayarlandı ve web.configsorunlara neden olan üst öğeden miras alıyor .

Tam olarak nereye yerleştirmeliyim

<location inheritInChildApplications="false">

böylece tüm web.config ayarlarını yok sayar?

Yanıtlar:


203

Önceki yanıtın yorumcularından bahsedildiği gibi, satırı ekleyemezsiniz ...

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

... hemen altında <configuration>. Bunun yerine, mirasını devre dışı bırakmak istediğiniz tek tek web.config bölümlerini sarmanız gerekir. Örneğin:

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

İken <clear />bazı yapılandırma bölümleri için Mayıs çalışmaları, orada yerine gerektiren bazı <remove name="...">direktifini ve hala diğerleri ya destekleyecek gibi görünmüyor. Bu durumlarda, muhtemelen ayarlamak uygundur inheritInChildApplications="false".


11
Bunu başka şekilde yapmak mümkün mü? Ayarların devralınması gerekip gerekmediğine karar veren çocuk olduğunda ebeveyni güncellemem gerektiğini garip buluyorum.
nabeelfarid

@nabeelfarid - Tamamen katılıyorum. Karmaşık bir web.config içeren bir .NET uygulamasının içinde bir wordpress blogunuz varsa, onu temizlemek veya kalıtımı önlemekle uğraşan büyük bir acı olabilir. Bence tüm 'konum' sistemi, çoğu insanın kendilerini burada bulduğu uyumluluk sorunları için paylaşılan ana bilgisayarlar için güvenlik etrafında daha fazla tasarlandığını düşünüyorum
Simon_Weaver

Bu benim için işe yaramıyor mu? Düşüncesi olan var mı? SIT veritabanı bağlantısı için üst yapılandırma ayarlanmış bir wcf hizmetim var. Ben aynı hizmet "QA" diyor başka bir klasör var ve web.config dahil ama QA veritabanı işaret SIT gibi aynı WCF hizmet dosyaları içerir. "QA" klasörü içinde wcf hizmetini çağırdığımda, bağlantı yalnızca üst yapılandırmadan (hatta <location> etiketi veririm) alır. Lütfen sorunun ne olacağını bana bildirin.
superachu

@NickCecil bunu IIS 6'da nasıl başarabilirim? öğesi inheritInChildApplicationsiçin geçerli bir parametre olarak kabul edilmiyor <location />. Web sitem SharePoint (2007) çalıştırıyor. Bu web sitesinin altında, kendi uygulama havuzu tarafından yönetilen sanal bir dizinde bir uygulama oluşturdum. Yine de, SharePoint'in yapılandırması ve bu uygulama arasında çakışmalarla karşılaşıyorum. Sunucu Hatası'na gönderdiğim bu soruya bakın .
Web Kullanıcısı

1
Bir web sitesinin alt öğesi olarak oluşturduğum uygulamam, DLL'leri üst web sitesinden yüklemek istiyor. Görünüşe göre, <location>çalışma zamanı için kullanamıyorum ...
Francis Ducharme

65

Doğrudan kök <configuration>düğümün altına gitmesi gerekir ve böyle bir yol ayarlamanız gerekir:

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

Yapılandırma devralmasını ele almanın daha iyi bir yolu <clear/>, alt yapılandırmada devralmak istemediğiniz her yerde bir a kullanmaktır . Bu nedenle, üst yapılandırmanın bağlantı dizelerini devralmak istemediyseniz şöyle bir şey yaparsınız:

<?xml version="1.0"?>
<configuration>
    <connectionStrings>
        <clear/>
        <!-- Child config's connection strings -->
    </connectionStrings>
</configuration>

17
Bu hatayı, ebeveynlerimin web.config dosyamda "Yapılandırmalar bölümü" yapılandırma bölümü okunamadı çünkü bölüm bildirimi eksik "iletisi alıyorum.
Blankman

Yapılandırmanızı içindeki <location> öğesi ile gönderebilir misiniz? Düzenlememe de göz atacağım ve <açık /> öğesinin yapmaya çalıştığınız şey için daha iyi bir yaklaşım olup olmadığını göreceğim.
Andrew Hare

6
<configuration> altına koyduğunuzda çalışmaz. Hadi <system.web> diyelim diyebiliriz ama sadece böyle köklere koyamazsınız.
PositiveGuy

2. düğüm olarak <configuration> altına koyarsanız, "inheritInChildApplications özniteliği bildirilmez" ifadesini alırsınız. Bu nedenle, web.config dosyasında bu düzeyde geçerli bir özellik değildir. Peki bunun işe yaradığını nasıl söyleyebilirsin?
PositiveGuy

12
-1: Yukarıda gösterildiği gibi konum öğesini kullanmanın ÇALIŞMADIĞINI doğrulayabilirim.
Adrian Grigore

23

Her şeyi içine koydum:

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

hariç: <configSections/>, <connectionStrings/>ve <runtime/>.

Bazı bölümleri devralmak istemediğimiz bazı durumlar vardır <configSections />, ancak <section/>etiketi içine koyamayız <location/>, bu nedenle bir <secionGroup />grup oluşturmamız ve istenmeyen bölümlerimizi bu gruba koymamız gerekir. Bölüm grupları daha sonra bir konum etiketine eklenebilir.

Yani bunu değiştirmek zorundayız:

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

İçine:

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

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

Ben özel bölümler
Kiquenet

Bu benim sorunumu çözdü. EF6.1.3 ile bir web uygulamam ve EF5 ile çocuk web uygulamam vardı. Çocuk web uygulamasını yükseltmek söz konusu değildi, bu yüzden her iki işi yapmak için bu tekniği kullanmak zorunda kaldım ve işe yaradı. Ben değiştirerek, bu örneği takip myNotInheritedSectionsetmek ef6Privateve unwantedSectionbir entityFrameworkbölümü.
Mohamed Nuur

Neden benim mayın çalışmıyor yardımcı olabilir, İşte benim kod <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

Kısa bir süre önce geliştirme ortamlarımızdan birine kod yayınlandıktan sonra bununla ilgili bir hata alıyorduk. Başka bir uygulamanın çocuğu olan bir uygulamamız var. Bu ilişki düne kadar YIL için iyi çalışıyor.

Sorun:
Yinelenen anahtarların girilmesi nedeniyle sarı bir yığın izleme hatası alıyorduk. Bunun nedeni, alt ve üst uygulamaların hem web.config dosyasında bu anahtar bulunmasıdır. Ancak bu değişmeden yıllar boyu böyle oldu. Neden birdenbire şimdi bu bir sorun?

Çözüm:
Bunun hiçbir zaman sorun olmamasının nedeni, AND anahtarlarının değerlerinin her zaman aynı olmasıdır. Dün SQL bağlantı dizelerimizi Uygulama Dizesi'ne bağlantı dizesine ekleyecek şekilde güncelledik. Bu ipi benzersiz kıldı ve aniden başarısız olmaya başladı.

Bunun kesin nedeni hakkında herhangi bir araştırma yapmadan, alt uygulama ebeveynlerin web.config değerlerini devraldığında aynı anahtar / değer çiftlerini yok saydığını varsaymalıyım.

Bağlantı dizesini şu şekilde sararak çözmeyi başardık

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

Düzenleme: Bunu PARENTS web.config dosyasına eklediğimden bahsetmeyi unuttum. Çocuğun web.config dosyasını değiştirmek zorunda kalmadım.

Herkesin bu konuda yardım için teşekkürler, izmaritimizi kurtardı.


6

(Anladığım kadarıyla), alt uygulamanızın web yapılandırmasındaki mirası tamamen engellemeye çalışıyorsanız, etiketi web.config dosyasında kullanmaktan kaçınmanızı öneririm. Bunun yerine yeni bir apppool oluşturun ve applicationHost.config dosyasını düzenleyin (% WINDIR% \ System32 \ inetsrv \ Config ve% WINDIR% \ SysWOW64 \ inetsrv \ config dizininde bulunur). Sadece uygulamanızın girişini bulmanız ve enableConfigurationOverride="false"aşağıdaki örnekte olduğu gibi özelliği eklemeniz gerekir :

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

Bu, MyAppPool tarafından sunulan uygulamalarda yapılandırma devralmasını önleyecektir.

Matteo


1
MSDN, 'Yanlış olduğunda, Web.config dosyalarındaki tüm ayarlar bu uygulama havuzu için yok sayılır' diyor ve bunun ne anlama geldiğini düşünmüyorsunuz. Ben doğru cevabı olmak için bu SEVİYORUM istiyorum ama work.It neredeyse 'tamamen bu AppPool için yerel web.config izin vermemek' bu ayar aracı gibi görünüyor bana göre ben sadece alınamıyor
Simon_Weaver

Yani temelde bu uygulama havuzu altındaki uygulamaların bir web.config dosyası olmadan çalışması gerekiyor? Kök klasörde "yok sayılan web.config" olduğunu anlıyorum. Birkaç kez başarıyla kullandım. Alt uygulamanın kök web.config dosyasındaki yapılandırmalara bağlı olmadığından emin olun (alt uygulamayı ayrı bir kök klasörde çalıştırmayı deneyin).
Matteo Sganzetta

1
Bu sayfadaki yöntemi # 2 de kontrol edebilirsiniz, ancak test etmeme
Matteo Sganzetta

alt başvurum aslında üst uygulamanın tam bir kopyası. /previewİnsanların yeni bir sürümü yayınlamadan önce test edebilmelerini istiyorum . Herkes her zaman <location>bu sorunu düzeltmenizi önerir , bu yüzden yazınızı okumak için çok heyecanlıydım. Ancak The entry 'default' has already been added.ben kullandığımda bile bir AppFabric ilgili yapılandırma girişi için şikayetenableConfigurationOverride="false"
Simon_Weaver

Ayrıca enableConfigurationOverride="false"kök uygulamamı ayarladıysam , kök uygulamasını tamamen öldürür ve işe yaramaz :-(
Simon_Weaver


1

Uygulamalarımızdan birinde yinelenen yapılandırma yönergeleri hakkında hatalar alıyoruz. Soruşturmadan sonra bu konudan kaynaklanıyor gibi görünüyor .

Kısacası, kök web sitemiz ASP.NET 3.5 (belirli kütüphaneler eklenmiş 2.0) ve ASP.NET 4.0 olan bir alt uygulamamız var.

web.config mirası, ASP.NET 4.0 alt uygulamasının üst ASP.NET 3.5 uygulamasının web.config dosyasını devralmasına neden olur.

Ancak, ASP.NET 4.0 uygulamasının C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.config ve C: \ Windows \ Microsoft dizinlerinde bulunan genel (veya "kök") web.config dosyası. NET \ Framework64 \ v4.0.30319 \ Config \ web.config (bitliliğinize bağlı olarak), bu yapılandırma bölümlerini zaten içeriyor.

ASP.NET 4.0 uygulaması daha sonra kök ASP.NET 4.0 web.config ile üst web.config (ASP.NET 3.5 uygulaması için olan) bir araya getirmeye çalışır ve düğümde kopyalar halinde çalışır.

Bulabildiğim tek çözüm, yapılandırma bölümlerini üst web.config dosyasından kaldırmaktır.

  1. Kök uygulamanızda onlara ihtiyacınız olmadığını veya gerekiyorsa belirleyin
  2. Üst uygulamayı ASP.NET 4.0'a yükseltin (böylece kök web.config dosyasının configSections öğesine erişim kazanır)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.