Programowa zmiana pliku web.config za pomocą języka C # (.NET)

93

Jak mogę modyfikować / manipulować web.configprogramowo za pomocą C #? Czy mogę użyć obiektu konfiguracyjnego, a jeśli tak, w jaki sposób załadować go web.configdo obiektu konfiguracyjnego? Chciałbym mieć pełny przykład zmieniający parametry połączenia. Po modyfikacji plik web.configpowinien zostać zapisany z powrotem na dysk twardy.

Kottan
źródło
Sprawdź jego wpis w blogu o tym, jak programowo manipulować web.config w ASP.NET 2.0 i ASP.NET 3.5 Alternatywnie sprawdź to pytanie, które zawiera odpowiedź na twoje pytanie. Jak ustawić programowo parametry połączenia w .net?
Shoban,

Odpowiedzi:

115

Oto kod:

var configuration = WebConfigurationManager.OpenWebConfiguration("~");
var section = (ConnectionStringsSection)configuration.GetSection("connectionStrings");
section.ConnectionStrings["MyConnectionString"].ConnectionString = "Data Source=...";
configuration.Save();

Zobacz więcej przykładów w tym artykule. Być może trzeba będzie przyjrzeć się kwestii podszywania się .

Alex LE
źródło
Jaka jest nazwa parametrów połączenia w pliku web.config?
Alex LE,
link do artykułu jest uszkodzony
Vitall
@AlexLE: W jaki sposób określimy lokalizację pliku, gdy plik web.config jest umieszczony w innym miejscu. Może to być zdalny serwer na wspólnej ścieżce?
SharpCoder,
@SharpCoder, ścieżka jest ścieżką wirtualną, więc musisz najpierw skopiować plik web.config ze zdalnego serwera do aplikacji lokalnej (w folderze tymczasowym, aby nie nadpisywać własnego pliku web.config), edytować go, zapisać, a następnie skopiować z powrotem do zdalnego serwera. Lub lepszym, bardziej złożonym rozwiązaniem byłoby: utworzenie API, które działa (zmiana de web.config), wdrożenie go na serwerze zdalnym, a następnie wykorzystanie go z serwera lokalnego.
Guilherme Branco Stracini
@Skami musisz ustawić nazwę connectionStrings na "MyConnectionString", co oznacza, że ​​wartość section.ConnectionStrings ["MyConnectionString"] powinna być zgodna z nazwą.
Liakat
12
Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
ConnectionStringsSection section = config.GetSection("connectionStrings") as ConnectionStringsSection;
//section.SectionInformation.UnprotectSection();
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
config.Save();
ASergan
źródło
Jak uzyskać identyfikator użytkownika ze zmiennej sekcji?
Niks
5

Ponieważ plik web.config jest plikiem xml, możesz otworzyć plik web.config za pomocą klasy xmldocument. Pobierz węzeł z tego pliku xml, który chcesz zaktualizować, a następnie zapisz plik xml.

tutaj jest adres URL, który wyjaśnia bardziej szczegółowo, w jaki sposób można programowo zaktualizować plik web.config.

http://patelshailesh.com/index.php/update-web-config-programmatically

Uwaga: jeśli wprowadzisz jakiekolwiek zmiany w pliku web.config, ASP.NET wykryje te zmiany i przeładuje Twoją aplikację (odtworzy pulę aplikacji), a efektem tego będą dane przechowywane w sesjach, aplikacji i pamięci podręcznej (zakładając, że stan sesji jest InProc i nie korzysta z serwera stanu ani bazy danych).

shailesh
źródło
Wiem, że jest to technicznie możliwe, myślę, że metoda usankcjonowana / zatwierdzona przez Microsoft będzie prawdopodobnie trwalsza i mniej podatna na złamanie pliku web.config. Wszyscy zaktualizowaliśmy te pliki „ręcznie”, ale myślę, że jest to ryzykowne w przypadku produkcyjnych serwerów WWW. Tylko mój 2c.
Anthony Horne,
2

Jest to metoda, której używam do aktualizacji AppSettings, działa zarówno dla aplikacji internetowych, jak i stacjonarnych. Jeśli chcesz edytować connectionStrings, możesz pobrać tę wartość z, System.Configuration.ConnectionStringSettings config = configFile.ConnectionStrings.ConnectionStrings["YourConnectionStringName"];a następnie ustawić nową wartość za pomocą config.ConnectionString = "your connection string";. Pamiętaj, że jeśli masz jakieś komentarze w connectionStringssekcji, Web.Configzostaną one usunięte.

private void UpdateAppSettings(string key, string value)
{
    System.Configuration.Configuration configFile = null;
    if (System.Web.HttpContext.Current != null)
    {
        configFile =
            System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
    }
    else
    {
        configFile =
            ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    }
    var settings = configFile.AppSettings.Settings;
    if (settings[key] == null)
    {
        settings.Add(key, value);
    }
    else
    {
        settings[key].Value = value;
    }
    configFile.Save(ConfigurationSaveMode.Modified);
    ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
}
Ogglas
źródło
Ten kod jest dobry i zagłosowałem za nim, ale nie zadziała, jeśli appSettings jest zdefiniowane w innym pliku, na przykład: <appSettings file = "C: \ Client \ customSettings.config"> </appSettings>
Ben Junior