Pertanyaan .NET Config Files configSource di luar folder direktori aplikasi


Saya memiliki dua aplikasi satu aplikasi konsol dan yang lainnya merupakan aplikasi ASP.NET. Mereka berdua harus mengetahui pengaturan aplikasi dan koneksi yang sama. Jadi idealnya saya ingin menggunakan properti configSource dari file app.config / web.config untuk mengarahkannya ke lokasi pusat. Sebagai contoh

<connectionStrings configSource="D:\connectionStrings.config"/>
<appSettings configSource="D:\appSettings.config"/>

Namun itu gagal dengan kesalahan:

Atribut configSource tidak valid: D configSource ': \ appSettings.config' tidak valid. Itu harus merujuk ke file di direktori yang sama atau di subdirektori sebagai file konfigurasi.

Apakah ada cara untuk tetap menggunakan manajer konfigurasi appSettings / connectionStrings dan mendapatkan nilai dari lokasi eksternal?
Saya senang karena harus menambahkan kode untuk melakukannya, tetapi saya tidak ingin mengganti seluruh sistem pengelola konfigurasi.


76
2018-02-20 10:54


asal


Jawaban:


Solusi lain hanyalah menambahkan file konfigurasi di semua proyek Anda sebagai tautan daripada benar-benar menyalin file ke proyek Anda. Kemudian atur "Build Action" dari file ke "Content" dan "Copy to Output Directory" ke "Salin jika lebih baru" dan ketika Anda mengkompilasi proyek, Anda akan memiliki file di direktori output.

Untuk menambahkan file sebagai tautan di kotak dialog "Tambah Item Yang Ada", ada tombol Tambah dengan dropdown. Pilih "Tambahkan sebagai tautan" dari tarik-turun di tombol Tambahkan untuk menyelesaikan proses.


91
2018-03-28 22:56



Di bawah appSettings Anda dapat menggunakan file = bukannya configSource =


29
2017-12-02 17:01



Sepertinya begitulah adanya. configSource harus berada di folder yang sama atau lebih dalam.

Kamu bisa, meski aku tidak yakin kamu harus, gunakan tautan keras NTFS. [Seringai gila]


16
2018-02-20 11:03



Anda dapat memuat konfigurasi dari lokasi yang sewenang-wenang, tapi itu tidak akan tersedia melalui properti statis ConfigurationManager:

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(Ada beban berlebih yang memungkinkan file multuple ditetapkan, untuk mendukung hierarki default / pengguna-roaming / pengguna-lokal.)

Kehilangan sifat statis berarti semua kode perlu menyadari konfigurasi yang berbeda.


8
2018-02-20 11:01



Visual Studio 2015

Jika Anda mengalami masalah ini dengan Web.Config, jawaban yang diterima benar tetapi hanya untuk memperluas karena ini membuat saya memberi diri saya telapak tangan:

Ketika Anda menambahkan file .config ke proyek Anda menggunakan 'Tambah Sebagai Tautan' dan kemudian mengatur properti Salin tautan ke 'Salin Jika Lebih Baru' atau 'Salin Selalu', maka file fisik akan disalin ke folder / bin.

Jadi, ketika Anda memiliki bagian konfigurasi yang didefinisikan di Web.Config seperti ini:

 <section name="mySpecialConfig" type="System.Configuration.AppSettingsSection" requirePermission="false" />

maka Anda harus menentukan elemen konfigurasi terkait seperti ini:

  <mySpecialConfig configSource="bin\MySpecialConfig.config">
  </mySpecialConfig>

sedemikian rupa sehingga configSource menunjuk ke file bin \ MySpecialConfig.config fisik bukan ke tautan  Juga, perhatikan bahwa jalannya adalah a relatif jalan fisik.

Itu mungkin tampak sangat aneh tetapi jika Anda belum melakukan ini sebelum file fisik belum dalam folder \ bin sehingga mungkin tidak langsung diklik.


4
2017-07-16 07:25



Anda dapat menempatkan kedua pengaturan di machine.config dan kemudian mereka tersedia untuk semua aplikasi Anda di server.


2
2018-02-20 11:01



Solusi yang saya temukan bekerja paling baik adalah meletakkan file konfigurasi "bersama" dalam file pusat dan kemudian menggunakan acara pra-membangun di Visual Studio untuk menyalinnya ke folder relatif setiap proyek yang membutuhkannya.


2
2018-03-11 11:02



Saya cukup bergumul dengan masalah ini, tetapi saya menemukan solusi yang bagus untuk itu di sini: uji coba dengan konfigurasi eksternal 

(Anda dapat mengarahkan uji coba untuk menyalin file dan direktori ke direktori uji coba dengan mengedit file .testrunconfig.)

Meskipun mengapa proyek jenis uji unit bisa mendapatkan pengaturan konfigurasi dari app.config sendiri, tetapi tidak dapat memuat file konfigurasi yang direferensikan seperti app.config biasa adalah jenis yang membingungkan bagi saya. Saya menyebutnya bug karena Anda mengharapkan aplikasi proyek uji coba.config untuk berperilaku sama seperti aplikasi app.config berperilaku, tetapi tidak.


2
2017-07-27 12:43



Dalam kasus string koneksi, memang mungkin untuk menunjuk ke file yang dibagikan. Jika file yang dibagikan ada di jaringan UNC, itu memerlukan hak administratif pada mesin tempat aplikasi akan dihosting.

Solusi: Di ​​web.config Anda, gunakan configSource untuk menunjuk ke file konfigurasi lokal. Karena pembatasan .Net, ini harus pada atau di bawah tingkat file konfigurasi root. Saya hanya menunjuk ke file di folder aplikasi itu sendiri:

<connectionStrings configSource="ConnectionStrings.config" />

Di lokasi bersama yang dapat diakses oleh pengguna kolam aplikasi, tambahkan file konfigurasi yang berisi string koneksi bersama. File ini tidak boleh mengandung xml selain dari bagian connectionStrings itu sendiri. File yang dibagikan, ConnectionStrings.config, terlihat seperti ini:

<connectionStrings>
    <clear/>
    <add name="connString1" connectionString="connString1 info goes here"/>
    <add name="connString2" connectionString="connString2 info goes here"/>
</connectionStrings>  

Sekarang triknya. Buat tautan simbolis Windows di folder aplikasi Anda yang menunjuk ke file konfigurasi bersama eksternal. Anda akan membutuhkan hak admin untuk melakukan ini:

mklink ConnectionStrings.config \\someServer\someShare\someFolder\ConnectionStrings.config

Kami baru saja mengakali .Net. Sistem Konfigurasi akan menggunakan pengaturan configSource untuk mencari string koneksi dalam file lokal bernama ConnectionStrings.config. Tautan simbolis tampak seperti file ke .Net, dan tautan simbolis diselesaikan ke file konfigurasi bersama.

Peringatan: Perubahan pada file yang dibagikan tidak secara otomatis memicu aplikasi dimulai ulang .Net. Dalam kasus IIS, situs web atau kumpulan aplikasi perlu direstart secara manual.

Karena kebutuhan akan hak administratif untuk membuat tautan simbolis, pendekatan ini mungkin tidak berfungsi untuk semua orang. Ada dua alternatif terkait yang dapat berfungsi jika file yang dibagikan ada di drive logis yang sama - tautan keras dan persimpangan. Lihat diskusi ini dan diskusi ini untuk informasi lebih lanjut.


2
2017-08-29 20:21