web-dev-qa-db-fra.com

Comment modifier les paramètres web.config appSettings au moment de l'exécution?

Je suis confus sur la façon de modifier les valeurs de web.config appSettings au moment de l'exécution. Par exemple, j'ai cette section 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>

Disons que je souhaite modifier la clé "homepagedesc" au moment de l'exécution. J'ai essayé les classes statiques ConfigurationManager et WebConfigurationManager, mais les paramètres sont "en lecture seule". Comment modifier les valeurs appSettings au moment de l'exécution?

UPDATE: Ok, alors me voilà 5 ans plus tard. J'aimerais souligner que l'expérience m'a appris que nous ne devrions pas mettre de configuration intentionnellement modifiable au moment de l'exécution dans le fichier web.config, mais plutôt dans un fichier XML séparé, comme le commente l'un des utilisateurs ci-dessous. Cela ne nécessitera aucune modification du fichier web.config pour redémarrer l'application, ce qui provoquera des appels de personnes en colère.

79
jerbersoft

Vous devez utiliser WebConfigurationManager.OpenWebConfiguration(): Par exemple:

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

Je pense que vous pourriez également avoir besoin de définir AllowLocation dans machine.config. C'est une valeur booléenne qui indique si des pages individuelles peuvent être configurées à l'aide de l'élément. Si "allowLocation" est faux, il ne peut pas être configuré dans des éléments individuels. 

Enfin, si vous exécutez votre application dans IIS et exécutez votre exemple de test à partir de Visual Studio, cela fait une différence. L'identité du processus ASP.NET est le compte IIS, ASPNET ou NETWORK SERVICES (selon la version de IIS).

Peut-être besoin d'accorder ASPNET ou NETWORK SERVICES Modifier l'accès sur le dossier où réside web.config. 

79
Mitch Wheat

Changer le web.config provoque généralement un redémarrage de l'application.

Si vous avez réellement besoin que votre application modifie ses propres paramètres, vous devez envisager une approche différente, telle que la création de bases de données ou la création d'un fichier XML avec les paramètres modifiables.

24
Joel

Et si vous voulez éviter le redémarrage de l'application, vous pouvez déplacer la section appSettings:

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

dans un fichier séparé. Et en combinaison avec ConfigurationSaveMode.Minimal

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

vous pouvez continuer à utiliser la section appSettings en tant que magasin pour divers paramètres sans provoquer le redémarrage de l'application et sans avoir à utiliser un fichier de format différent de celui de la section appSettings normale.

21
Ciprian Teiosanu

2012 Il s'agit d'une meilleure solution pour ce scénario (testé avec Visual Studio 2008 ):

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

Mise à jour 2018 =>
Testé en vs 2015 - Asp.net MVC5 

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

si vous avez besoin de vérifier l'élément, utilisez le code suivant: 

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

Je sais que cette question est ancienne, mais je voulais publier une réponse basée sur la situation actuelle dans le monde ASP.NET\IIS, combinée à mon expérience du monde réel.

J'ai récemment dirigé un projet dans mon entreprise, dans lequel je souhaitais consolider et gérer tous les paramètres appSettings & connectionStrings de nos fichiers web.config dans un emplacement centralisé. Je voulais poursuivre une approche où nos paramètres de configuration étaient stockés dans ZooKeeper en raison de la maturité et de la stabilité de ces projets. Sans oublier le fait que ZooKeeper est par sa conception une application de gestion de configuration et de cluster.

Les objectifs du projet étaient très simples.

  1. obtenir ASP.NET pour communiquer avec ZooKeeper
  2. dans Global.asax, Application_Start - extrait les paramètres web.config de ZooKeeper.

Après avoir réussi à convaincre ASP.NET de parler à ZooKeeper, j'ai rapidement trouvé et frappé un mur avec le code suivant;

ConfigurationManager.AppSettings.Add(key_name, data_value)

Cette déclaration avait le sens le plus logique puisque je voulais ajouter de nouveaux paramètres à la collection appSettings. Toutefois, comme l'a mentionné l'affiche originale (et bien d'autres), cet appel de code renvoie une erreur indiquant que la collection est en lecture seule. 

Après avoir fait quelques recherches et constaté toutes les différentes manières insensées de résoudre ce problème, je me suis senti très découragé. Au lieu d'abandonner ou de régler ce qui semblait être un scénario moins qu'idéal, j'ai décidé de creuser pour voir s'il me manquait quelque chose. 

Avec quelques essais et erreurs, j'ai trouvé que le code suivant ferait exactement ce que je voulais;

ConfigurationManager.AppSettings.Set(key_name, data_value)

En utilisant cette ligne de code, je peux maintenant charger les 85 clés appSettings de ZooKeeper dans mon Application_Start.

En ce qui concerne les instructions générales sur les modifications apportées à web.config qui déclenchent le recyclage IIS, j'ai modifié les paramètres suivants de appPool pour surveiller la situation en coulisse;

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

Avec cette combinaison de paramètres, si ce processus devait provoquer un recyclage appPool, une entrée du journal des événements aurait dû être enregistrée, ce qui n'était pas le cas.

Ceci m'amène à conclure qu'il est possible, et en toute sécurité, de charger les paramètres d'une application à partir d'un support de stockage centralisé.

Je dois mentionner que j'utilise IIS7.5 sur Windows 7. Le code sera déployé sur IIS8 sur Win2012. Si quelque chose concernant cette réponse change, je mettrai cette réponse à jour en conséquence. 

12
Sage

Qui aime directement au point,

Dans votre config

    <appSettings>

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

  </appSettings>

dans votre code (c #)

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

Essaye ça:

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