Je ne sais pas comment modifier les valeurs appSettings de web.config lors 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 veux 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 lors de l'exécution?
MISE À JOUR: Ok, donc me voici 5 ans plus tard. Je tiens à souligner que l'expérience m'a dit, nous ne devrions pas mettre de configuration qui est intentionnellement modifiable au moment de l'exécution dans le fichier web.config, mais au lieu de cela, nous devrions le mettre dans un fichier XML séparé comme ce que l'un des utilisateurs a commenté ci-dessous. Cela ne nécessitera aucune modification du fichier web.config pour redémarrer l'application, ce qui entraînera des utilisateurs en colère qui vous appelleront.
la source
Réponses:
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 devrez peut-être également définir AllowLocation dans machine.config. Il s'agit d'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, cela fait une différence si vous exécutez votre application dans IIS et exécutez votre exemple de test à partir de Visual Studio. L'identité du processus ASP.NET est le compte IIS, ASPNET ou NETWORK SERVICES (selon la version IIS).
Il se peut que vous deviez accorder un accès à ASPNET ou à NETWORK SERVICES Modifier sur le dossier où réside web.config.
la source
La modification du fichier web.config entraîne généralement un redémarrage de l'application.
Si vous avez vraiment besoin que votre application modifie ses propres paramètres, vous devez envisager une approche différente, telle que la base de données des paramètres ou la création d'un fichier xml avec les paramètres modifiables.
la source
Et si vous souhaitez éviter le redémarrage de l'application, vous pouvez sortir de la
appSettings
section:<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
appSettings
section comme magasin pour divers paramètres sans provoquer le redémarrage de l'application et sans avoir besoin d'utiliser un fichier avec un format différent de la section normale appSettings.la source
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'existence d'un élément, utilisez ce code:
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();
la source
Je sais que cette question est ancienne, mais je voulais publier une réponse basée sur l'état actuel des choses dans le monde ASP.NET \ IIS combiné à mon expérience du monde réel.
J'ai récemment dirigé un projet dans mon entreprise dans lequel je voulais consolider et gérer tous les paramètres appSettings & connectionStrings dans nos fichiers web.config en un seul endroit central. 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é des projets. Sans oublier que ZooKeeper est par conception une application de gestion de configuration et de cluster.
Les objectifs du projet étaient très simples;
Après avoir passé la partie technique pour obtenir ASP.NET pour 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. Cependant, comme l'affiche d'origine (et bien d'autres) l'a mentionné, cet appel de code renvoie une erreur indiquant que la collection est en lecture seule.
Après avoir fait un peu de recherche et vu toutes les différentes façons folles dont les gens travaillaient autour de ce problème, j'étais très découragée. Au lieu d'abandonner ou de me contenter de ce qui semblait être un scénario loin d'être idéal, j'ai décidé de creuser et de voir si je manquais quelque chose.
Avec un peu d'essais et d'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 suis maintenant en mesure de charger les 85 clés appSettings de ZooKeeper dans mon Application_Start.
En ce qui concerne les déclarations générales sur les modifications apportées à web.config déclenchant le recyclage d'IIS, j'ai modifié les paramètres appPool suivants pour surveiller la situation dans les coulisses;
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.
Cela m'amène à conclure qu'il est possible, et en fait sûr, 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. En cas de changement concernant cette réponse, je mettrai à jour cette réponse en conséquence.
la source
Qui aime directement au point,
Dans votre configuration
<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();
la source
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(); } } }
la source