Uygulama dizini klasörünün dışındaki .NET Yapılandırma Dosyaları configSource


82

Biri konsol uygulaması ve diğeri bir ASP.NET uygulaması olan iki uygulamam var. İkisinin de aynı appSettings ve connectionStrings bilgisine ihtiyacı var. Bu yüzden ideal olarak, bunu merkezi bir konuma yönlendirmek için app.config / web.config dosyalarının configSource özelliğini kullanmak istiyorum. Örneğin

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

Ancak bu, bir hatayla başarısız olur:

ConfigSource özniteliği geçersiz. ConfigSource 'D: \ appSettings.config' geçersiz. Yapılandırma dosyasıyla aynı dizindeki veya bir alt dizindeki bir dosyaya başvurmalıdır.

Yapılandırma yöneticileri appSettings / connectionStrings'i kullanmaya ve değerleri harici bir konumdan almaya yine de var mı?
Bunu yapmak için kod eklemek zorunda kaldığım için mutluyum, ancak tüm yapılandırma yöneticisi sistemini değiştirmek zorunda kalmak istemiyorum.

Yanıtlar:


103

Diğer bir çözüm, dosyayı gerçekte projelerinize kopyalamak yerine, yapılandırma dosyasını tüm projelerinize bir bağlantı olarak eklemektir. Daha sonra dosyanın "Oluşturma Eylemi" ni "İçerik" olarak ve "Çıktı Dizinine Kopyala" yı "Daha yeniyse kopyala" olarak ayarlayın ve projeyi derlediğinizde çıktı dizininde dosya olacaktır.

Dosyayı "Mevcut Öğeyi Ekle" iletişim kutusunda bir bağlantı olarak eklemek için, açılır menüye sahip bir Ekle düğmesi vardır. İşlemi tamamlamak için Ekle düğmesindeki açılır menüden "Bağlantı olarak ekle" yi seçin.


güzel - insanların anlaması benim yöntemimden çok daha kolay
Robert MacLean

10
merhaba, bu yanıtı beğendim ve kendi projeme uygulamaya çalıştım ve uygulamamı "yayınladığımda" her şey yolunda görünüyor (db.config, söylediğiniz gibi webroot'a kopyalanıyor), ancak VS aracılığıyla hata ayıklarken değil & Cassini. Bunun yerine "configSource dosyası 'db.config'" açılamıyor "istisnası alıyorum. Bunu yapabilmek için kaçırdığım bir şey var mı? Teşekkürler!
Funka

16
Tabii ki, ayrılmaya ve yardım isteyen bir yorum göndermeye karar verdikten hemen sonra, hemen sonra anlıyorum. Db.config'imin de / bin / klasörüne kopyalandığını fark ettim , bu yüzden web.config'imi bu yolu başına ekleyecek şekilde güncelledim configSourceve her şey yolunda görünüyor. Tekrar teşekkürler!
Funka

1
@Funka - db.config'inizin "Derleme Eylemi" özelliği varsayılan web.config gibi "İçerik" yerine "Yok" olarak ayarlandığından, sorun yaşayıp yaşamadığınızı kontrol edin. Ayarların "Build Action" = "Content" ve "Output Directory" = "Do not copy" olması gerektiğine inanıyorum.
bopapa_1979

1
Bu, VS 2013'te hata ayıklarken çalışmıyor gibi görünüyor. Erics çözümünü denedim ve bu da işe yaramadı.
Chris Nevill


16

Görünüşe göre bu böyle. configSource aynı klasörde veya daha derinde olmalıdır.

Sen olabilir emin değilim ancak sen gerektiğini , NTFS hardlink kullanın. [deli sırıtış]


10

Visual Studio 2015

Web.Config ile bu sorunu yaşıyorsanız, kabul edilen cevap doğrudur, ancak bunu genişletmek için kendime avuç içi verdim:

'Bağlantı Olarak Ekle'yi kullanarak projenize bir .config dosyası eklediğinizde ve ardından bağlantının Kopyala özelliğini' Daha Yeniyse Kopyala 'veya' Her Zaman Kopyala 'olarak ayarladığınızda, fiziksel dosya / bin klasörüne kopyalanacaktır.

Bu nedenle, Web.Config'de şu şekilde tanımlanmış bir yapılandırma bölümünüz olduğunda:

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

daha sonra ilgili yapılandırma öğesini şu şekilde tanımlamalısınız:

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

configSource , bağlantıya değil fiziksel bin \ MySpecialConfig.config dosyasına işaret edecek şekilde Ayrıca, yolun göreceli bir fiziksel yol olduğuna dikkat edin .

Bu gülünç bir şekilde açık görünebilir, ancak fiziksel dosya henüz \ bin klasöründe olmadığından önce bunu yapmadıysanız hemen tıklamayabilir.


8

Yapılandırmayı rastgele bir konumdan yükleyebilirsiniz, ancak ConfigurationManager'ın statik özellikleri aracılığıyla kullanılamaz:

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(Varsayılan / kullanıcı dolaşımı / kullanıcı yerel hiyerarşisini desteklemek için çoklu dosyaların belirlenmesine izin veren bir aşırı yük vardır.)

Statik özelliklerin kaybedilmesi, tüm kodun farklı yapılandırmalardan haberdar olması gerektiği anlamına gelir.


Bu, tüm yapılandırma dosyasının yüklenmesini gerektirir. Sadece appSettings & connectionStrings'in aynı olmasına ihtiyacım var, dosyanın geri kalanı her uygulama için farklı olduğundan sorunu çözmüyor.
Robert MacLean

Yapılandırmanın tamamı zaten normal (statik) özellikler tarafından yüklenir, bu nedenle bu gerçek bir fark yaratmaz.
Richard

Ayrıca, kendi XML biçiminizi kullanabilir ve adını uygulamaların yapılandırma dosyalarına ekleyebilir ve doğrudan okuyabilirsiniz.
Richard

5

Bağlantı dizileri durumunda, paylaşılan bir dosyaya işaret etmek gerçekten mümkündür. Paylaşılan dosya bir ağ UNC üzerindeyse, uygulamanın barındırılacağı makinede yönetici ayrıcalıkları gerektirir.

Çözüm: web.config dosyanızda, yerel bir yapılandırma dosyasına işaret etmek için configSource'u kullanın. .Net kısıtlamaları nedeniyle, bu, kök yapılandırma dosyası düzeyinde veya altında olmalıdır. Sadece uygulama klasöründeki bir dosyaya işaret ediyorum:

<connectionStrings configSource="ConnectionStrings.config" />

Uygulama havuzu kullanıcısı tarafından erişilebilen paylaşılan bir konumda, paylaşılan bağlantı dizelerini içeren yapılandırma dosyasını ekleyin. Bu dosya, connectionStrings bölümünün kendisi dışında herhangi bir xml içermemelidir. Paylaşılan ConnectionStrings.config dosyası şu şekilde görünür:

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

Şimdi numara. Uygulama klasörünüzde harici, paylaşılan yapılandırma dosyasına işaret eden bir Windows sembolik bağlantısı oluşturun. Bunu yapmak için yönetici ayrıcalıklarına ihtiyacınız olacak:

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

.Net'i zekice aştık. Yapılandırma sistemi, ConnectionStrings.config adlı yerel bir dosyadaki bağlantı dizelerini bulmak için configSource ayarını kullanır. Sembolik bağ, .Net'e bir dosya gibi görünür ve sembolik bağ, paylaşılan yapılandırma dosyasına çözümlenir.

Uyarılar: Paylaşılan dosyadaki değişiklikler .Net'te bir uygulamanın yeniden başlatılmasını otomatik olarak tetiklemez. IIS durumunda, web sitesi veya uygulama havuzunun manuel olarak yeniden başlatılması gerekecektir.

Sembolik bağlantıyı oluşturmak için yönetici ayrıcalıklarına duyulan ihtiyaç nedeniyle, bu yaklaşım herkes için işe yaramayabilir. Paylaşılan dosya aynı mantıksal sürücü üzerindeyse işe yarayabilecek ilgili iki alternatif vardır - sabit bağlantılar ve bağlantılar. Daha fazla bilgi için bu tartışmaya ve bu tartışmaya bakın.


3

Her iki ayarı da machine.config dosyasına yerleştirebilir ve ardından bunlar sunucudaki tüm uygulamalarınız için kullanılabilir.


Bu bir seçenek ancak makinedeki diğer uygulamaların kullanabileceği ayarların olmasını istemiyorum (ihtiyacım var). Endişe bağlantı dizeleridir, diğer uygulamalarla çakışabilecek oldukça genel isimleri vardır.
Robert MacLean

2

Bulduğum en iyi çözüm, "paylaşılan" yapılandırma dosyalarını merkezi bir dosyaya koymak ve ardından bunları gereken her projenin göreceli bir klasörüne kopyalamak için Visual Studio'da bir ön derleme olayını kullanmaktı.


2

Bu sorunla epeyce mücadele ettim, ancak burada bunun için iyi bir çözüm buldum: harici yapılandırma ile test çalıştırması

(.Testrunconfig dosyasını düzenleyerek dosyaları ve dizinleri test çalıştırma dizinine kopyalamak için test çalıştırmasını yönlendirebilirsiniz.)

Her ne kadar birim test tipi proje kendi app.config dosyasından yapılandırma ayarlarını alabilse de, normal bir app.config gibi referanslı yapılandırma dosyalarını yükleyemese de benim için biraz kafa karıştırıcı. Bunu bir hata olarak adlandırırım çünkü bir test projesi app.config'in uygulamanın app.config'inin davranışıyla aynı şekilde davranmasını beklersiniz, ancak böyle davranmaz.


1

fileÖzniteliği yerine kullanabilirsinizconfigSource

İyi bir makale var burada üzerinde

Bu, böyle bir göreceli yol belirlemenize olanak tanır.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings file="..\..\..\..\..\..\ExternalFile.config"></appSettings>
</configuration>

Yol, çıktı dizinine bağlıdır.

Ardından ExternalFile.config dosyasında appSettingsbölümü eklemeniz yeterlidir

<appSettings>
    <add key="SomeKey" value="alue"/>
</appSettings>
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.