Come si modifica l’app web.configSettings in fase di esecuzione?

Sono confuso su come modificare i valori di appSettings di web.config in fase di esecuzione. Ad esempio, ho questa sezione appSettings:

       

Diciamo che voglio modificare la chiave “homepagedesc” in fase di esecuzione. Ho provato le classi statiche di ConfigurationManager e WebConfigurationManager, ma le impostazioni sono “di sola lettura”. Come posso modificare i valori di appSettings in fase di esecuzione?

AGGIORNAMENTO: Ok, eccomi qui 5 anni dopo. Vorrei sottolineare che l’esperienza mi ha detto che non dovremmo mettere alcuna configurazione che sia intenzionalmente modificabile in runtime nel file web.config, ma dovremmo invece inserirla in un file XML separato come quello che uno degli utenti ha commentato di seguito. Ciò non richiederà alcuna modifica del file web.config per riavviare l’app che si tradurrà in utenti arrabbiati che ti chiamano.

È necessario utilizzare WebConfigurationManager.OpenWebConfiguration() : Ad esempio:

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

Penso che potrebbe anche essere necessario impostare AllowLocation in machine.config. Questo è un valore booleano che indica se è ansible configurare singole pagine utilizzando l’elemento. Se “allowLocation” è false, non può essere configurato in singoli elementi.

Infine, fa la differenza se si esegue l’applicazione in IIS e si esegue l’esempio di test da Visual Studio. L’id quadro del processo ASP.NET è l’account IIS, ASPNET o NETWORK SERVICES (a seconda della versione di IIS).

Potrebbe essere necessario concedere ASPNET o SERVIZI DI RETE Modificare l’accesso alla cartella in cui risiede web.config.

La modifica di web.config causa generalmente il riavvio di un’applicazione.

Se hai davvero bisogno che la tua applicazione modifichi le proprie impostazioni, allora dovresti considerare un approccio diverso, come il databasing delle impostazioni o la creazione di un file xml con le impostazioni modificabili.

E se vuoi evitare il riavvio dell’applicazione, puoi spostare la sezione appSettings :

  

in un file separato. E in combinazione con ConfigurationSaveMode.Minimal

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

puoi continuare a utilizzare la sezione appSettings come archivio per le varie impostazioni senza causare il riavvio dell’applicazione e senza la necessità di utilizzare un file con un formato diverso rispetto alla normale sezione appSettings.

2012 Questa è una soluzione migliore per questo scenario (testato con Visual Studio 2008 ):

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

Aggiornamento 2018 =>
Testato nel 2015 – Asp.net MVC5

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

se è necessario verificare l’elemento, utilizzare questo codice:

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

So che questa domanda è vecchia, ma volevo pubblicare una risposta basata sullo stato attuale delle cose nel mondo ASP.NET \ IIS combinato con la mia esperienza del mondo reale.

Recentemente ho guidato un progetto nella mia azienda in cui volevo consolidare e gestire tutte le impostazioni di appSettings e connectionStrings nei nostri file web.config in un’unica posizione centrale. Volevo seguire un approccio in cui le impostazioni di configurazione erano memorizzate in ZooKeeper a causa della maturità e della stabilità dei progetti. Per non parlare del fatto che ZooKeeper è progettato da un’applicazione di configurazione e gestione dei cluster.

Gli obiettivi del progetto erano molto semplici;

  1. ottenere ASP.NET per comunicare con ZooKeeper
  2. in Global.asax, Application_Start – richiama le impostazioni di web.config da ZooKeeper.

Dopo aver superato l’aspetto tecnico di ottenere ASP.NET per parlare con ZooKeeper, ho rapidamente trovato e colpito un muro con il seguente codice;

 ConfigurationManager.AppSettings.Add(key_name, data_value) 

Questa affermazione ha avuto il significato più logico dal momento che volevo aggiungere nuove impostazioni alla raccolta di appSettings. Tuttavia, come menzionato il poster originale (e molti altri), questa chiamata al codice restituisce un errore che indica che la raccolta è di sola lettura.

Dopo aver fatto un po ‘di ricerche e visto tutti i diversi modi folli, le persone hanno lavorato attorno a questo problema, sono stato molto scoraggiato. Invece di arrendermi o accontentarmi di quello che sembrava essere uno scenario tutt’altro che ideale, ho deciso di scavare e vedere se mi mancava qualcosa.

Con un po ‘di prove ed errori, ho trovato che il codice seguente avrebbe fatto esattamente quello che volevo;

 ConfigurationManager.AppSettings.Set(key_name, data_value) 

Usando questa linea di codice, ora sono in grado di caricare tutte le 85 chiavi appSettings da ZooKeeper nel mio Application_Start.

Per quanto riguarda le affermazioni generali sulle modifiche all’triggerszione di web.config, IIS ricicla, ho modificato le seguenti impostazioni di appPool per monitorare la situazione dietro le quinte;

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

Con questa combinazione di impostazioni, se questo processo dovesse causare un riciclo di appPool, è necessario registrare una voce del registro degli eventi, che invece non era.

Ciò mi porta a concludere che è ansible, e addirittura sicuro, caricare le impostazioni di un’applicazione da un supporto di archiviazione centralizzato.

Devo dire che sto usando IIS7.5 su Windows 7. Il codice verrà distribuito su IIS8 su Win2012. Se qualcosa riguardo a questa risposta cambia, aggiornerò di conseguenza questa risposta.

A chi piace direttamente al punto,

Nella tua configurazione

     

nel tuo codice (c #)

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

Prova questo:

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