Jak modyfikować sieć.config appSettings w czasie wykonywania?

Jestem zdezorientowany, jak modyfikować sieć.config appSettings wartości w czasie wykonywania. Na przykład mam sekcję appSettings:

<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, że chcę zmodyfikować klucz "homepagedesc"podczas wykonywania. Próbowałem statycznych klas ConfigurationManager i WebConfigurationManager, ale ustawienia są "tylko do odczytu". Jak modyfikować wartości appSettings w czasie wykonywania?

UPDATE: OK, więc jestem 5 lat później. Chciałbym podkreślić, że doświadczenie mówi mi, że nie należy umieszczać żadnych konfiguracja, która celowo jest edytowalna w czasie wykonywania w sieci.plik konfiguracyjny, ale zamiast tego powinniśmy umieścić go w osobnym pliku XML, jak to, co jeden z użytkowników skomentował poniżej. Nie będzie to wymagało żadnej edycji web.plik konfiguracyjny do ponownego uruchomienia aplikacji, co spowoduje, że wściekli użytkownicy zadzwonią do ciebie.

Author: jerbersoft, 2009-04-06

7 answers

Musisz użyć WebConfigurationManager.OpenWebConfiguration(): Na Przykład:

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 może być również konieczne ustawienie AllowLocation w maszynie.config. Jest to wartość logiczna, która wskazuje, czy poszczególne strony mogą być skonfigurowane za pomocą elementu. Jeśli "allowLocation" jest false, nie można go skonfigurować w poszczególnych elementach.

Wreszcie, to robi różnicę, jeśli uruchomić aplikację w IIS i uruchomić próbkę testową z Visual Studio. Na ASP.NET tożsamość procesu To konto IIS, ASPNET lub usługi sieciowe (w zależności od wersji IIS).

Może być konieczne przyznanie ASPNET lub usługi sieciowe zmodyfikować dostęp do folderu, w którym web.config.

 79
Author: Mitch Wheat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-12 00:15:00

Zmiana sieci.config zazwyczaj powoduje ponowne uruchomienie aplikacji.

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

 24
Author: Joel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-06 00:22:19

I jeśli chcesz uniknąć ponownego uruchomienia aplikacji, możesz przenieść appSettings sekcję:

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

Do osobnego pliku. Oraz w połączeniu z ConfigurationSaveMode.Minimal

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

Możesz nadal używać sekcji appSettings jako magazynu dla różnych ustawień bez powodowania ponownego uruchamiania aplikacji i bez konieczności używania pliku o innym formacie niż normalna sekcja appSettings.

 21
Author: Ciprian Teiosanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-13 08:19:02

2012 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 w vs 2015 - Asp.net MVC5

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

Jeśli chcesz sprawdzić, czy element istnieje, użyj 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();
 17
Author: Amin Ghaderi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-31 03:05:38

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.

Ostatnio stałem na czele projektu w mojej firmie, w którym chciałem skonsolidować i zarządzać wszystkimi ustawieniami appSettings & connectionStrings w naszej sieci.pliki konfiguracyjne w jednym centralnym miejscu. Chciałem realizować podejście, w którym nasze ustawienia konfiguracyjne były przechowywane w ZooKeeper ze względu na dojrzałość projektów i stabilność. Nie do wspomnij o tym, że ZooKeeper jest z założenia aplikacją do zarządzania konfiguracją i klastrem.

Cele projektu były bardzo proste;

  1. get ASP.NET aby komunikować się z Zookeeperem
  2. in Global.asax, Application_Start-pull web.ustawienia konfiguracji z ZooKeeper.

Po przejściu technicznego kawałka zdobywania ASP.NET aby porozmawiać z Zookeeperem, szybko znalazłem i Uderzyłem w ścianę poniższym kodem; {]}

ConfigurationManager.AppSettings.Add(key_name, data_value)

To stwierdzenie sprawiło, że najbardziej sens logiczny, 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 stwierdzający, że kolekcja jest tylko do odczytu.

Po przeprowadzeniu trochę badań i widząc wszystkie różne szalone sposoby ludzie pracowali wokół tego problemu, byłem bardzo zniechęcony. Zamiast poddać się lub zadowolić się czymś, co wydawało się być mniej niż idealnym scenariuszem, postanowiłem zagłębić się w to i zobaczyć, czy czegoś mi nie brakuje.

Z odrobiną prób i błędów, znalazłem następujący kod zrobi dokładnie to, co chciałem;

ConfigurationManager.AppSettings.Set(key_name, data_value)

Korzystając z tej linii kodu, jestem teraz w stanie załadować wszystkie 85 kluczy appSettings z ZooKeeper w moim Application_Start.

W odniesieniu do ogólnych oświadczeń o zmianach w sieci.konfigurację 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

Z tą kombinacją ustawień, jeśli ten proces spowodowałby appPool recycle, wpis dziennika zdarzeń powinien być zarejestrowany, a nie był.

To prowadzi mnie do wniosku, że możliwe i rzeczywiście bezpieczne jest ładowanie ustawień aplikacji ze scentralizowanego nośnika pamięci.

Powinienem wspomnieć, że używam IIS7. 5 W Windows 7. Kod zostanie wdrożony do IIS8 na Win2012. Jeśli cokolwiek dotyczące tej odpowiedzi ulegnie zmianie, zaktualizuję tę odpowiedź.

 12
Author: Sage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-06 12:46:51

Kto lubi bezpośrednio do punktu,

In your Config

    <appSettings>

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

  </appSettings>

W Twoim kodzie (c#)

///SET
    ConfigurationManager.AppSettings.Set("Conf_id", "whateveryourvalue");
      ///GET              
    string conf = ConfigurationManager.AppSettings.Get("Conf_id").ToString();
 3
Author: mzonerz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 12:34:36

Spróbuj Tego:

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();
        }
    }
}
 0
Author: Code Alumni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-01 01:14:59