Çalışma zamanında web.config appSettings'i nasıl değiştirirsiniz?


84

Çalışma zamanında web.config appSettings değerlerini nasıl değiştireceğim konusunda kafam karıştı. Örneğin, şu appSettings bölümüm var:

<appSettings>
  <add key="productspagedesc" value="TODO: Edit this default message" />
  <add key="servicespagedesc" value="TODO: Edit this default message" />
  <add key="contactspagedesc" value="TODO: Edit this default message" />
  <add key="aboutpagedesc" value="TODO: Edit this default message" />
  <add key="homepagedesc" value="TODO: Edit this default message" />
 </appSettings>

Diyelim ki, çalışma zamanında "homepagedesc" anahtarını değiştirmek istiyorum. ConfigurationManager ve WebConfigurationManager statik sınıflarını denedim, ancak ayarlar "salt okunur". Çalışma zamanında appSettings değerlerini nasıl değiştiririm?

GÜNCELLEME: Tamam, işte 5 yıl sonrayım. Deneyimin bana söylediğini belirtmek isterim ki, çalışma zamanında kasıtlı olarak düzenlenebilir herhangi bir konfigürasyonu web.config dosyasına koymamalıyız, bunun yerine kullanıcılardan birinin aşağıda yorumladığı gibi ayrı bir XML dosyasına koymalıyız. Bu, Uygulamayı yeniden başlatmak için web.config dosyasında herhangi bir düzenleme gerektirmeyecektir, bu da öfkeli kullanıcıların sizi aramasına neden olacaktır.


İşte çalışma zamanında web.config'in değiştirilmesi ve uygulamadaki etkisi hakkında güzel bir şekilde açıklayan iyi bir bağlantı. http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at-runtime.html

5
@ user330004 sağladığınız bağlantı artık geçerli değil
McArthey

Arşivlenmiş sürümü bulmak sadece birkaç saniye sürer !
stuartd

Yanıtlar:


84

Kullanmanız gerekenler WebConfigurationManager.OpenWebConfiguration(): Örneğin:

Dim myConfiguration As Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~")
myConfiguration.ConnectionStrings.ConnectionStrings("myDatabaseName").ConnectionString = txtConnectionString.Text
myConfiguration.AppSettings.Settings.Item("myKey").Value = txtmyKey.Text
myConfiguration.Save()

Ayrıca machine.config içinde AllowLocation ayarlamanız gerekebileceğini düşünüyorum . Bu, tek tek sayfaların öğe kullanılarak yapılandırılıp yapılandırılamayacağını gösteren bir boole değeridir. "AllowLocation" yanlışsa, tek tek öğelerde yapılandırılamaz.

Son olarak, uygulamanızı IIS'de çalıştırıp test örneğinizi Visual Studio'dan çalıştırmanız fark yaratır. ASP.NET işlem kimliği, IIS hesabı, ASPNET veya NETWORK HİZMETLERİ'dir (IIS sürümüne bağlı olarak).

Web.config'in bulunduğu klasörde ASPNET veya NETWORK SERVICES Modify erişim izni vermeniz gerekebilir.


1
Cevap Mitch için teşekkürler. Soruma cevap verdin. Yaptığım şey VS 2008'i Yönetici olarak çalıştırmaktı ve her şey yolunda gidiyordu.
jerbersoft

Belki başkaları için aşikar (benim için değildi), bu yanıt ve işlevsel olarak aynı olan Amin gibi, aslında fiziksel web.config dosyanızın üzerine yazıyor, sadece belirli çalışan örnek için bellekteki ayarı geçersiz kılmıyor.
k3davis

24

Web.config'in değiştirilmesi genellikle uygulamanın yeniden başlatılmasına neden olur.

Uygulamanızın kendi ayarlarını düzenlemesine gerçekten ihtiyacınız varsa, ayarları veri tabanına almak veya düzenlenebilir ayarlarla bir xml dosyası oluşturmak gibi farklı bir yaklaşım düşünmelisiniz.


1
Merhaba, cevap için teşekkürler. Ancak "Kaydet" işlevi olan bu "Yapılandırma" sınıfı vardır. Yeni ayarların aktif olması için uygulamayı gerçekten yeniden başlatmanız gerekiyor mu?
jerbersoft

4
Web.config'in değiştirilmesi, uygulamanın yeniden başlatılmasını otomatik olarak tetikler.
Mike Cole

1
Web.config'in dinamik olarak değiştirilmesi tavsiye edilmemelidir. Değeri bir (xml) dosyasında saklamayı tercih ederim.
Deepak Mishra

Birisi uygulamayı yeniden başlatmanın neden kötü olduğunu açıklayabilir ve çoğu kişi özelliği farklı bir dosyaya taşımayı önerebilir mi?
Ben

1
@Ben - O zamandan beri birkaç ay geçtiğini biliyorum, ancak her ihtimale karşı - uygulamayı yeniden başlatmak, yeniden başlatma noktasında uygulamanıza giriş yapan herkesin otomatik olarak çıkış yapacağı ve büyük olasılıkla bir hatayla karşılaşacağı anlamına gelir. (Web çiftlikleri gibi çeşitli senaryolar, buna rağmen ...). kızgın kullanıcıların iletişim desteği, destek kişileri size vs vs vs ...
Fetchez la vache

24

Ve uygulamanın yeniden başlamasını önlemek istiyorsanız, appSettingsbölümün dışına çıkabilirsiniz :

<appSettings configSource="Config\appSettings.config"/>

ayrı bir dosyaya. Ve kombinasyon halindeConfigurationSaveMode.Minimal

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.Save(ConfigurationSaveMode.Minimal);

appSettingsbölümü, uygulamanın yeniden başlamasına neden olmadan ve normal appSettings bölümünden farklı bir biçime sahip bir dosya kullanmaya gerek kalmadan çeşitli ayarlar için mağaza olarak kullanmaya devam edebilirsiniz .


22

2012 Bu, bu senaryo için daha iyi bir çözümdür ( Visual Studio 2008 ile test edilmiştir ):

Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
config.AppSettings.Settings.Remove("MyVariable");
config.AppSettings.Settings.Add("MyVariable", "MyValue");
config.Save();

Güncelleme 2018 =>
2015'e karşı test edildi - Asp.net MVC5

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
config.Save();

Eleman varlığını kontrol etmeniz gerekiyorsa, bu kodu kullanın:

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
if (config.AppSettings.Settings["MyVariable"] != null)
{
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
}
else { config.AppSettings.Settings.Add("MyVariable", "MyValue"); }
config.Save();

Neden daha iyi olduğunu biraz açıklar mısınız? ConfigSection öğelerinin bazen biraz zor olduğunu biliyorum.
julealgon

1
Bu kod daha küçük ve daha anlaşılır! En azından benim için.
Amin Ghaderi

3
Oh, o zaman kişisel zevkten dolayı, mantıksal olarak bir şekilde farklı olduğunu düşündüm. Bu durumda, aslında bir dizi nedenden ötürü size kesinlikle katılmıyorum: birincisi, aynı anahtarı iki kez belirtmeniz gerektiğinden, ikincisi, yaptığınız şey anlamsal olarak gerçekten gerekenden farklı olduğu için ('güncelle' ve 'kaldır-> add ') ve üçüncü çünkü kod aslında daha uzun (neden burada başka türlü düşündüğünüzden emin değilim) ve hatalara açık. Ayrıca, herhangi bir nedenle kodunuz aramalar arasında başarısız olursa ne olur? Sanırım başvurunuz oradan bozuldu.
julealgon

2
Bu kod, MyVariable'daki tüm yorum kardeşlerini siler.
blagus

Evet kesinlikle ! Bu kod kodu tüm değişkenleri yeniden yazabilir, ancak işe yarıyor. ama yorum kodunu kullandığınızda onu kullanmanızı tavsiye etmem. Teşekkür ederim.
Amin Ghaderi

14

Bu sorunun eski olduğunu biliyorum, ancak ASP.NET \ IIS dünyasındaki mevcut durumu ve gerçek dünya deneyimimi birleştirerek bir yanıt göndermek istedim.

Kısa bir süre önce şirketimde, web.config dosyalarımızdaki tüm appSettings & connectionStrings ayarlarını tek bir merkezi yerde konsolide etmek ve yönetmek istediğim bir projeye öncülük ettim. Olgunluk ve istikrar projelerinden dolayı yapılandırma ayarlarımızın ZooKeeper'da depolandığı bir yaklaşım benimsemek istedim. ZooKeeper'ın tasarım gereği bir yapılandırma ve küme yönetimi uygulaması olduğundan bahsetmiyorum bile.

Proje hedefleri çok basitti;

  1. ZooKeeper ile iletişim kurmak için ASP.NET edinin
  2. Global.asax içinde, Application_Start - ZooKeeper'dan web.config ayarlarını çekin.

ZooKeeper ile konuşmak için ASP.NET'i edinmenin teknik parçasını geçtikten sonra, hızlı bir şekilde aşağıdaki kodla bir duvara çarptım ve çarptım;

ConfigurationManager.AppSettings.Add(key_name, data_value)

Bu ifade, appSettings koleksiyonuna yeni ayarlar EKLEMEK istediğim için en mantıklı olanıydı. Ancak, orijinal göndericinin (ve diğerlerinin) bahsettiği gibi, bu kod çağrısı, koleksiyonun Salt Okunur olduğunu belirten bir Hata döndürür.

Biraz araştırma yaptıktan ve insanların bu problem etrafında çalıştığı tüm farklı çılgın yolları gördükten sonra, çok cesaretim kırıldı. İdealden daha az görünen senaryodan vazgeçmek ya da razı olmak yerine, kazmaya ve bir şeyi kaçırıp kaçırmadığımı görmeye karar verdim.

Biraz deneme yanılma ile aşağıdaki kodun tam olarak istediğimi yapacağını buldum;

ConfigurationManager.AppSettings.Set(key_name, data_value)

Bu kod satırını kullanarak artık ZooKeeper'daki 85 appSettings anahtarının tamamını Application_Start'ıma yükleyebiliyorum.

IIS geri dönüşümlerini tetikleyen web.config değişiklikleriyle ilgili genel ifadelerle ilgili olarak, perde arkasındaki durumu izlemek için aşağıdaki appPool ayarlarını düzenledim;

appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True

Bu ayar kombinasyonuyla, eğer bu işlem bir appPool geri dönüşümüne neden olacaksa, bir Olay Günlüğü girişi kaydedilmelidir, ki bu kayıt olmamalıdır.

Bu beni, merkezi bir depolama ortamından bir uygulama ayarını yüklemenin mümkün ve gerçekten güvenli olduğu sonucuna götürüyor.

Windows 7'de IIS7.5 kullandığımı belirtmeliyim. Kod, Win2012'de IIS8'e konuşlandırılacak. Bu cevapla ilgili herhangi bir değişiklik olursa, bu cevabı buna göre güncelleyeceğim.


Bu muhtemelen bana birkaç saat kazandırdı. Çok teşekkürler!
Drew Delano

4

Doğrudan noktayı seven,

Config'inizde

    <appSettings>

    <add key="Conf_id" value="71" />

  </appSettings>

kodunuzda (c #)

///SET
    ConfigurationManager.AppSettings.Set("Conf_id", "whateveryourvalue");
      ///GET              
    string conf = ConfigurationManager.AppSettings.Get("Conf_id").ToString();

0

Bunu dene:

using System;
using System.Configuration;
using System.Web.Configuration;

namespace SampleApplication.WebConfig
{
    public partial class webConfigFile : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Helps to open the Root level web.config file.
            Configuration webConfigApp = WebConfigurationManager.OpenWebConfiguration("~");
            //Modifying the AppKey from AppValue to AppValue1
            webConfigApp.AppSettings.Settings["ConnectionString"].Value = "ConnectionString";
            //Save the Modified settings of AppSettings.
            webConfigApp.Save();
        }
    }
}
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.