2009-04-06 13 views
73

Nie mam pojęcia, jak zmodyfikować ustawienia aplikacji web.config w środowisku wykonawczym. Na przykład, mam tej sekcji appSettings:Jak modyfikować ustawienia aplikacji web.config w środowisku wykonawczym?

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

powiedzmy Chcę zmodyfikować klucz „homepagedesc” przy starcie. Próbowałem klas statycznych ConfigurationManager i WebConfigurationManager, ale ustawienia są "tylko do odczytu". Jak zmodyfikować wartości appSettings w środowisku wykonawczym?

AKTUALIZACJA: OK, więc tutaj jestem 5 lat później. Chciałbym zaznaczyć, że doświadczenie mówi mi, że nie powinniśmy umieszczać żadnej konfiguracji, która celowo jest edytowalna w środowisku wykonawczym w pliku web.config, ale zamiast tego powinniśmy umieścić ją w oddzielnym pliku XML, co jeden z użytkowników skomentował poniżej. Nie będzie to wymagało żadnej edycji pliku web.config w celu ponownego uruchomienia aplikacji, co spowoduje, że do Ciebie zadzwonią wściekli użytkownicy.

+0

Oto dobry link, który ładnie wyjaśnia modyfikowanie pliku web.config a t runtime i jego wpływ na aplikację. [http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at-runtime.html](http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at- runtime.html) –

+5

@ user330004 podany link nie jest już ważny – McArthey

+0

Zajmie to tylko kilka sekund, aby znaleźć [zarchiwizowaną wersję] (http://web.archive.org/web/20111217082254/http://aspdotnethacker. blogspot.com/2010/05/modify-webconfig-file-at-runtime.html)! – stuartd

Odpowiedz

75

Trzeba użyć WebConfigurationManager.OpenWebConfiguration(): Dla przykładu:

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

myślę, że trzeba także ustawić AllowLocation w machine.config. Jest to wartość logiczna wskazująca, czy poszczególne strony mogą być konfigurowane za pomocą tego elementu. Jeśli "allowLocation" ma wartość false, nie można go skonfigurować w poszczególnych elementach.

Wreszcie, robi różnicę, jeśli uruchomisz swoją aplikację w IIS i uruchomisz próbkę testową z Visual Studio. Identyfikator procesu ASP.NET to konto IIS, ASPNET lub USŁUGI SIECIOWE (w zależności od wersji IIS).

Może być konieczne przyznanie ASPNET lub USŁUG SIECI Zmodyfikuj dostęp do folderu, w którym znajduje się plik web.config.

+1

Dzięki za odpowiedź Mitch. Odpowiedziałeś na moje pytanie. To, co zrobiłem, to uruchomiłem VS 2008 jako Administrator i wszystko poszło dobrze. – jerbersoft

22

Zmiana pliku web.config powoduje na ogół restart aplikacji.

Jeśli naprawdę potrzebujesz aplikacji do edycji własnych ustawień, powinieneś rozważyć inne podejście, takie jak tworzenie bazy danych ustawień lub tworzenie pliku xml z ustawieniami do edycji.

+1

Cześć, dziękuję za odpowiedź. Ale jest klasa "Configuration", która ma funkcję "Save". Czy naprawdę musisz ponownie uruchomić aplikację, aby nowe ustawienia były aktywne? – jerbersoft

+4

Zmiana pliku web.config powoduje automatyczne ponowne uruchomienie aplikacji. –

+1

Nie zaleca się dynamicznej zmiany pliku web.config. Wolałbym przechowywać wartość w pliku (xml). –

16

Jest to lepsze rozwiązanie dla tego scenariusza (testowane z Visual Studio 2008):

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

Aktualizacja 2018 =>
Testowane vs 2015 - Asp.net MVC5

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

jeśli potrzebujesz O elementem kontroli istnieje, należy użyć tego kodu:

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(); 
+0

Czy mógłbyś nieco wyjaśnić, dlaczego jest lepiej? Wiem, że rzeczy konfiguracyjne czasami są trochę trudne. – julealgon

+0

Ten kod jest mniejszy i bardziej zrozumiały! Przynajmniej dla mnie. –

+3

Och, to z powodu osobistego gustu, faktycznie myślałem, że to jakoś logicznie się różniło. Bardzo się z tym nie zgadzam, choć z kilku powodów: po pierwsze dlatego, że musisz dwukrotnie podać ten sam klucz, po drugie, ponieważ to, co robisz, jest semantycznie odmienne od tego, co jest rzeczywiście potrzebne ("aktualizacja" kontra "usunięcie-> dodaj ") i trzecią, ponieważ kod jest rzeczywiście dłuższy (nie wiesz, dlaczego tutaj jest inaczej) i otwarty na błędy. Co się stanie, jeśli z jakiegoś powodu twój kod zawiedzie między połączeniami? Zgaduję, że twoja aplikacja jest zepsuta. – julealgon

21

A jeśli chcesz uniknąć ponownego uruchomienia aplikacji, można wyprowadzić sekcję appSettings:

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

do osobnego pliku.A w połączeniu z ConfigurationSaveMode.Minimal

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

można nadal korzystać z sekcji appSettings jako magazyn dla różnych ustawień nie powodując ponowne uruchomienie aplikacji i bez konieczności korzystania z plików innego formatu niż normalnej sekcji appSettings.

11

Wiem, że to pytanie jest stare, ale chciałem opublikować odpowiedź na podstawie aktualnego stanu rzeczy w świecie ASP.NET \ IIS w połączeniu z moim prawdziwym doświadczeniem.

Niedawno stałem na czele projektu w mojej firmie, w którym chciałem skonsolidować i zarządzać wszystkimi ustawieniami connectionStrings & w naszych plikach web.config w jednym centralnym miejscu. Chciałem zastosować podejście, w którym nasze ustawienia konfiguracyjne były przechowywane w ZooKeeper ze względu na stabilność projektów w zakresie dojrzałości &. Nie wspominając o tym, że ZooKeeper jest z założenia aplikacją do zarządzania klastrem o konfiguracji &.

Cele projektu były bardzo proste;

  1. get ASP.NET do komunikowania się z Heca
  2. w Global.asax Application_Start - ciągnąć ustawień web.config od Heca.

Po przekazaniu technicznego fragmentu programu ASP.NET do rozmowy z ZooKeeper, szybko znalazłem i uderzyłem w ścianę z następującym kodem;

ConfigurationManager.AppSettings.Add(key_name, data_value) 

To oświadczenie nabrało logicznego sensu, ponieważ chciałem DODAĆ nowe ustawienia do kolekcji appSettings. Jednak, jak wspomniano w oryginalnym plakacie (i wielu innych), to wywołanie kodu zwraca błąd informujący, że kolekcja jest tylko do odczytu.

Po zrobieniu trochę badań i zobaczeniu różnych szalonych sposobów, w jaki ludzie pracowali nad tym problemem, byłem bardzo zniechęcony. Zamiast poddać się lub rozstrzygnąć coś, co wyglądało na mniej niż idealny scenariusz, postanowiłem zagłębić się i zobaczyć, czy czegoś brakuje.

Z małą próbą i błędem, znalazłem następujący kod zrobiłby dokładnie to, co chciałem;

ConfigurationManager.AppSettings.Set(key_name, data_value) 

Korzystanie z tej linii kodu, jestem teraz w stanie załadować wszystkie 85 AppSettings kluczy Heca w moim Application_Start.

Jeśli chodzi o ogólne stwierdzenia dotyczące zmian w pliku web.config powodującym ponowne przetwarzanie usług IIS, edytowałem następujące ustawienia aplikacji, aby monitorować sytuację za kulisami;

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

Dzięki tej kombinacji ustawień, jeśli proces ten miał spowodować zawracanie appPool, wpis dziennika zdarzeń powinien być rejestrowane, którego nie było.

To prowadzi mnie do wniosku, że jest możliwe, a nawet bezpieczne, załadowanie ustawień aplikacji ze scentralizowanego nośnika.

Należy wspomnieć, że używam IIS7.5 na Windows 7. Kod zostanie wdrożony do IIS8 na Win2012. Jeśli cokolwiek dotyczy tej odpowiedzi, zmienię tę odpowiedź odpowiednio.

+0

To prawdopodobnie tylko zaoszczędziło mi kilka godzin. Dzięki wielkie! –

+0

Nie ma za co. – Sage

2

Kto lubi bezpośrednio do punktu,

W swojej Config

<appSettings> 

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

    </appSettings> 

w kodzie (C#)

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

Spróbuj to:

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(); 
     } 
    } 
} 
Powiązane problemy