Hindari pewarisan web.config dalam aplikasi web anak menggunakan aplikasi inheritInChild

153

Saya mencoba menambahkan

<location inheritInChildApplications="false">

ke web.config aplikasi web orang tua saya tetapi tampaknya tidak berfungsi.

Orang tua saya web.configmemiliki:

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

Aplikasi web anak saya diatur sebagai aplikasi di IIS, dan merupakan warisan dari orangtua web.configyang menyebabkan masalah.

Di mana tepatnya saya harus meletakkan

<location inheritInChildApplications="false">

jadi itu mengabaikan semua pengaturan berbagai web.config?

Blankman
sumber

Jawaban:

203

Seperti komentar para komentator untuk jawaban sebelumnya, Anda tidak dapat dengan mudah menambahkan baris ...

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

... tepat di bawah <configuration>. Sebagai gantinya, Anda perlu membungkus bagian web.config individual yang ingin Anda nonaktifkan pewarisannya. Sebagai contoh:

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

Meskipun <clear />mungkin berfungsi untuk beberapa bagian konfigurasi, ada beberapa yang malah membutuhkan <remove name="...">arahan, dan yang lain tampaknya tidak mendukung. Dalam situasi ini, mungkin tepat untuk ditetapkan inheritInChildApplications="false".

Nick Cecil
sumber
11
Apakah mungkin untuk melakukannya sebaliknya? Saya merasa aneh bahwa saya harus memperbarui orang tua, ketika itu adalah anak yang memutuskan apakah pengaturan harus diwarisi atau tidak.
nabeelfarid
@nabeelfarid - Saya sepenuhnya setuju. Jika Anda memiliki blog wordpress di dalam aplikasi .NET dengan web.config yang kompleks, itu bisa sangat menyebalkan dengan menghapusnya atau mencegah warisan. Saya pikir seluruh sistem 'lokasi' dirancang lebih pada keamanan untuk host bersama yang untuk masalah kompatibilitas kebanyakan orang menemukan diri mereka di sini
Simon_Weaver
Ini tidak berhasil untuk saya? Adakah pikiran? Saya punya layanan wcf yang konfigurasi induknya disetel ke koneksi database SIT. Saya memiliki folder lain di layanan yang sama yang mengatakan "QA" dan berisi file layanan WCF yang sama seperti di SIT termasuk web.config tetapi mengarahkan database ke QA. Ketika saya memanggil layanan wcf di dalam folder "QA", dibutuhkan koneksi dari konfigurasi induk saja (bahkan saya memberikan tag <lokasi>). Tolong beri tahu saya apa masalahnya.
superachu
@NickCecil bagaimana cara mencapai ini di IIS 6? inheritInChildApplicationstidak diterima sebagai parameter yang valid untuk <location />elemen. Situs web saya menjalankan SharePoint (2007). Saya membuat aplikasi di direktori virtual di bawah situs web ini, dikelola oleh kumpulan aplikasi sendiri. Namun, saya menghadapi konflik antara konfigurasi SharePoint dan aplikasi ini. Lihat pertanyaan ini yang saya posting di Server Fault.
Pengguna Web
1
Aplikasi saya yang saya buat sebagai anak dari situs web masih ingin memuat DLL dari situs web induk. Rupanya, saya tidak bisa menggunakan <location>untuk runtime ...
Francis Ducharme
65

Perlu masuk langsung di bawah <configuration>simpul root dan Anda perlu mengatur jalur seperti ini:

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

Cara yang lebih baik untuk menangani warisan konfigurasi adalah dengan menggunakan <clear/>konfigurasi anak di mana pun Anda tidak ingin mewarisi. Jadi jika Anda tidak ingin mewarisi string koneksi orangtua konfigurasi Anda akan melakukan sesuatu seperti ini:

<?xml version="1.0"?>
<configuration>
    <connectionStrings>
        <clear/>
        <!-- Child config's connection strings -->
    </connectionStrings>
</configuration>
Andrew Hare
sumber
17
Saya mendapatkan kesalahan ini "Bagian konfigurasi 'configSections' tidak dapat dibaca karena tidak ada deklarasi bagian" di file web.config orang tua saya.
Blankman
Bisakah Anda memposting konfigurasi Anda dengan elemen <lokasi> di dalamnya? Saya juga akan memeriksa hasil edit saya dan melihat apakah <clear /> mungkin pendekatan yang lebih baik untuk apa yang Anda coba lakukan.
Andrew Hare
6
itu tidak berfungsi ketika Anda meletakkannya tepat di bawah <configuration>. Anda dapat membungkus katakanlah simpul <system.web> tetapi Anda tidak bisa hanya meletakkannya di root seperti ini.
PositiveGuy
Jika Anda meletakkannya di bawah <configuration> sebagai simpul kedua, Anda mendapatkan "atribut inheritInChildApplications tidak dideklarasikan". Jadi itu bukan atribut yang valid pada level itu di web.config. Jadi bagaimana Anda bisa mengatakan ini berhasil?
PositiveGuy
12
-1: Saya juga dapat mengonfirmasi bahwa menggunakan elemen lokasi seperti yang ditunjukkan di atas TIDAK berfungsi.
Adrian Grigore
23

Saya memasukkan semuanya ke dalam:

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

kecuali: <configSections/>, <connectionStrings/>dan <runtime/>.

Ada beberapa kasus ketika kami tidak ingin mewarisi beberapa bagian <configSections />, tetapi kami tidak dapat memasukkan <section/>tag <location/>, jadi kami harus membuat <secionGroup />dan menempatkan bagian yang tidak diinginkan ke dalam grup itu. Grup bagian kemudian dapat dimasukkan ke dalam tag lokasi.

Jadi kita harus mengubah ini:

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

Ke:

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

<location path="." inheritInChildApplications="false">
    <myNotInheritedSections>
        <unwantedSection />
    </myNotInheritedSections>
</location>
menangis
sumber
Saya memiliki bagian khusus
Kiquenet
Ini menyelesaikan masalah saya. Saya punya aplikasi web dengan EF6.1.3 dan aplikasi web anak dengan EF5. Memutakhirkan aplikasi web anak tidak ada pertanyaan, jadi saya harus menggunakan teknik ini untuk membuat keduanya berfungsi dan berfungsi. Saya mengikuti contoh ini, berubah myNotInheritedSectionsmenjadi ef6Privatedan unwantedSectionadalah entityFrameworkbagian.
Mohamed Nuur
Dapatkah Anda membantu mengapa milik saya tidak berfungsi, Ini kode saya <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

Kami mendapatkan kesalahan terkait hal ini setelah rilis kode baru-baru ini ke salah satu lingkungan pengembangan kami. Kami memiliki aplikasi yang merupakan anak dari aplikasi lain. Hubungan ini telah bekerja dengan baik untuk TAHUN hingga kemarin.

Masalahnya:
Kami mendapatkan kesalahan pelacakan tumpukan kuning karena kunci duplikat dimasukkan. Ini karena kedua web.config untuk aplikasi anak dan orang tua memiliki kunci ini. Tapi ini ada selama bertahun-tahun seperti ini tanpa perubahan. Mengapa tiba-tiba ini menjadi masalah sekarang?

Solusinya:
Alasan ini tidak pernah menjadi masalah adalah karena kunci DAN nilai selalu sama. Kemarin kami memperbarui string koneksi SQL kami untuk memasukkan Nama Aplikasi dalam string koneksi. Ini membuat string unik dan tiba-tiba mulai gagal.

Tanpa melakukan penelitian pada alasan yang tepat untuk ini, saya harus mengasumsikan bahwa ketika aplikasi anak mewarisi nilai web.config orang tua, itu mengabaikan pasangan kunci / nilai yang identik.

Kami dapat menyelesaikannya dengan membungkus string koneksi seperti ini

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

Edit: Saya lupa menyebutkan bahwa saya menambahkan ini di PARENTS web.config. Saya tidak perlu mengubah web.config anak.

Terima kasih atas bantuan semua orang dalam hal ini, menyelamatkan puntung kami.

Kenneth Garza
sumber
6

Jika (seperti yang saya mengerti) Anda mencoba untuk sepenuhnya memblokir warisan di konfigurasi web aplikasi anak Anda, saya sarankan Anda untuk menghindari menggunakan tag di web.config. Alih-alih buat apppool baru dan edit file applicationHost.config (terletak di% WINDIR% \ System32 \ inetsrv \ Config dan% WINDIR% \ SysWOW64 \ inetsrv \ config). Anda hanya perlu menemukan entri untuk apppool Anda dan menambahkan atribut enableConfigurationOverride="false"seperti pada contoh berikut:

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

Ini akan menghindari warisan konfigurasi dalam aplikasi yang dilayani oleh MyAppPool.

Matteo

Matteo Sganzetta
sumber
1
MSDN mengatakan 'Ketika salah, semua pengaturan dalam file Web.config akan diabaikan untuk kumpulan aplikasi ini' dan itu tidak seperti apa yang Anda pikirkan artinya. Saya akan CINTA ini menjadi jawaban yang tepat tapi aku tidak bisa mendapatkannya untuk work.It hampir tampak bagi saya seperti pengaturan ini berarti 'benar-benar melarang web.config lokal untuk AppPool ini'
Simon_Weaver
Jadi pada dasarnya aplikasi di bawah kumpulan aplikasi ini seharusnya berfungsi tanpa file web.config? Saya mengerti bahwa "web.config yang diabaikan" adalah yang ada di folder root. Saya menggunakannya beberapa kali dengan sukses. Pastikan aplikasi anak tidak bergantung pada konfigurasi di root web.config (coba jalankan aplikasi anak di folder root terpisah).
Matteo Sganzetta
1
Anda juga dapat memeriksa metode # 2 di halaman ini, walaupun saya belum mengujinya iislogs.com/steveschofield/2009/09/20/…
Matteo Sganzetta
aplikasi anak saya sebenarnya adalah salinan persis dari aplikasi induk. Saya ingin dapat membuat /previeworang dapat menguji versi baru sebelum membuatnya hidup. Semua orang selalu menyarankan <location>untuk memperbaiki masalah ini jadi saya sangat senang membaca posting Anda. Namun itu mengeluh The entry 'default' has already been added.untuk entri konfigurasi AppFabric terkait bahkan ketika saya menggunakanenableConfigurationOverride="false"
Simon_Weaver
juga jika saya mengatur enableConfigurationOverride="false"aplikasi root saya itu benar-benar membunuh aplikasi root dan itu bahkan tidak akan berfungsi :-(
Simon_Weaver
1

Kami mendapatkan kesalahan tentang arahan konfigurasi rangkap di salah satu aplikasi kami. Setelah diselidiki sepertinya karena masalah ini .

Singkatnya, situs web root kami adalah ASP.NET 3.5 (yang 2.0 dengan perpustakaan tertentu ditambahkan), dan kami memiliki sub aplikasi yaitu ASP.NET 4.0.

pewarisan web.config menyebabkan sub-aplikasi ASP.NET 4.0 mewarisi file web.config dari aplikasi induk ASP.NET 3.5.

Namun, web.config global (atau "root") aplikasi ASP.NET 4.0, yang berada di C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.config dan C: \ Windows \ Microsoft. NET \ Framework64 \ v4.0.30319 \ Config \ web.config (tergantung pada bitness Anda), sudah berisi bagian konfigurasi ini.

Aplikasi ASP.NET 4.0 kemudian mencoba untuk menggabungkan bersama ASP.NET 4.0 web.config root, dan web.config induk (yang untuk aplikasi ASP.NET 3.5), dan berjalan ke duplikat dalam node.

Satu-satunya solusi yang saya dapat temukan adalah dengan menghapus bagian konfigurasi dari web.config induk, dan kemudian baik

  1. Tentukan bahwa Anda tidak membutuhkannya di aplikasi root Anda, atau jika Anda membutuhkannya
  2. Tingkatkan aplikasi induk ke ASP.NET 4.0 (sehingga mendapatkan akses ke konfigurasi root web.config)
Josh
sumber