Lecture des paramètres depuis app.config ou web.config dans .NET

807

Je travaille sur une bibliothèque de classes C # qui doit pouvoir lire les paramètres du web.configou du app.configfichier (selon que la DLL est référencée à partir d'une application Web ASP.NET ou d'une application Windows Forms).

J'ai trouvé ça

ConfigurationSettings.AppSettings.Get("MySetting")

fonctionne, mais ce code a été marqué comme déconseillé par Microsoft.

J'ai lu que je devrais utiliser:

ConfigurationManager.AppSettings["MySetting"]

Cependant, la System.Configuration.ConfigurationManagerclasse ne semble pas être disponible à partir d'un projet de bibliothèque de classes C #.

Quelle est la meilleure façon de procéder?

Russ Clark
la source
48
Comme si j'avais lu 4 exemples et articles MSDN. Et j'ai atterri ici. Ajoutez simplement une référence .. pourquoi ne peuvent-ils pas simplement dire cela. Bonne question! +1
Piotr Kula
1
Si vous souhaitez également réécrire les paramètres , regardez ici comment vous pouvez le faire.
Matt

Réponses:

798

Vous devrez ajouter une référence à System.Configurationdans le dossier de références de votre projet .

Vous devriez certainement utiliser le ConfigurationManagerover the obsolete ConfigurationSettings.

womp
la source
Merci beaucoup! réponse très simple. Je construisais une application console! et cette réponse sauve la mise!
PatsonLeaner
1
Est-ce toujours exact pour le noyau .net?
Triynko
869

Pour un exemple de fichier app.config comme ci-dessous:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="countoffiles" value="7" />
    <add key="logfilelocation" value="abc.txt" />
  </appSettings>
</configuration>

Vous lisez les paramètres d'application ci-dessus en utilisant le code ci-dessous:

using System.Configuration;

Vous devrez peut-être également ajouter une référence à System.Configurationdans votre projet s'il n'y en a pas déjà une. Vous pouvez ensuite accéder aux valeurs comme ceci:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];
RAM
la source
124
J'aime votre réponse plus que la réponse acceptée. Les réponses avec des exemples font toujours l'affaire pour moi.
Brendan Vogt
Cela a fonctionné pour moi. Cependant, ma System.Configuration ne contient pas de ConfigurationManager, j'ai donc dû utiliser ConfigurationSettings. Ironiquement, j'ai quand même reçu un avertissement que c'était obsolète.
Nightmare Games
13
Cela m'est arrivé aussi. Avez-vous essayé d'ajouter la référence System.Configuration? Le problème est que VS vous trompe en vous faisant croire que vous l'avez réellement; vous pouvez utiliser intellisense pour obtenir l'espace de noms System.Configuration mais il n'a pas la classe ConfigurationManager. Ajoutez simplement la référence et cela le corrige.
Francine DeGrood Taylor
3
@Cricketheads System.Configuration contient ConfigurationManager, il vous manque probablement une référence à System.Configuration dans votre projet.
TreK
2
Quelqu'un peut-il me dire pourquoi il pense que System.Configuration n'est pas ajouté par défaut ... cela semble être un besoin assez basique dans la plupart des applications.
Todd Vance
89

Mise à jour pour .NET Framework 4.5 et 4.6; les éléments suivants ne fonctionneront plus:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

Accédez maintenant à la classe Setting via Propriétés:

string keyvalue = Properties.Settings.Default.keyname;

Voir Gestion des paramètres d'application pour plus d'informations.

bsivel
la source
1
Propriétés depuis 2010 .
Nick Westgate
1
Merci beaucoup d'avoir publié cela. J'ai déterminé que Properties.Settings.Default.MachName fonctionnait, mais je n'ai pas pu comprendre pourquoi ConfigurationManager.AppSettings ["MachName"] a retourné null.
J. Chris Compton
1
Cela a mis fin à mon agonie prolongée. Merci. Le cadre devrait vous avertir que l'ancienne méthode est obsolète.
Neil B
7
Je ne peux pas confirmer. Le ConfigurationManager.AppSettings ["someKey"] fonctionne dans .NET 4.5, 4.6, 4.7.1
Ivanhoe
1
@Ivanhoe Quelle version de VisualStudio avez-vous utilisée? Le ConfigurationManager.AppSettings ["someKey"] a fonctionné avec 4.6.1 et VS 15.8.2 mais a échoué avec 4.6.1 et VS 15.9.2 pour moi.
kkuilla
37

Faites un clic droit sur votre bibliothèque de classes et choisissez l'option "Ajouter des références" dans le menu.

Et dans l'onglet .NET, sélectionnez System.Configuration. Cela inclurait le fichier DLL System.Configuration dans votre projet.

Shiva
la source
Après avoir ajouté une référence, a pu le faireConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy
29

J'utilise ceci, et cela fonctionne bien pour moi:

textBox1.Text = ConfigurationManager.AppSettings["Name"];
Pagey
la source
48
Le TS déclare explicitement qu'il utilise le même code, mais son projet ne parvient pas à compiler (en raison de références manquantes, comme il s'est avéré). -1 pour ne pas avoir lu la question.
Isantipov
23

Lire depuis la configuration:

Vous devrez ajouter une référence à la configuration:

  1. Ouvrez "Propriétés" sur votre projet
  2. Allez dans l'onglet "Paramètres"
  3. Ajouter "Nom" et "Valeur"
  4. Obtenez de la valeur en utilisant le code suivant:

    string value = Properties.Settings.Default.keyname;

Enregistrez dans la configuration:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();
Masoud Siahkali
la source
1
Pour info: Google préfère votre réponse. S'affiche textuellement lorsque vous recherchez "get app config settings c #"
Steve Gomez
21

Vous devez ajouter une référence à l'assembly System.Configuration au projet.

Otávio Décio
la source
18

Vous ajoutez peut-être le fichier App.config à un fichier DLL. App.Config ne fonctionne que pour les projets exécutables, car tous les fichiers DLL prennent la configuration du fichier de configuration pour le fichier EXE en cours d'exécution.

Supposons que vous ayez deux projets dans votre solution:

  • SomeDll
  • SomeExe

Votre problème peut être lié au fait que vous incluez le fichier app.config dans SomeDLL et non SomeExe. SomeDll est capable de lire la configuration du projet SomeExe.

Victor Naranjo
la source
Wow, ce n'est pas évident. Si quelqu'un pouvait lier un document à ce sujet, ce serait fantastique. C'est un sujet difficile à rechercher.
David Krider
Merci pour cela. Je n'ai vu cela déclaré nulle part.
paramètre
10

Essaye ça:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

Dans le fichier web.config , cela devrait être la structure suivante:

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>
Ruslan
la source
8

J'ai eu le même problème. Lisez-les simplement de cette façon: System.Configuration.ConfigurationSettings.AppSettings ["MySetting"]

À M
la source
4
Selon Microsoft concernant ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M
2
cette méthode est obsolète
GabrielBB
7

web.configest utilisé avec les applications Web. web.configpar défaut, plusieurs configurations sont requises pour l'application Web. Vous pouvez avoir un web.configpour chaque dossier sous votre application Web.

app.configest utilisé pour les applications Windows. Lorsque vous générez l'application dans Visual Studio, elle sera automatiquement renommée <appname>.exe.configet ce fichier doit être fourni avec votre application.

Vous pouvez utiliser la même méthode pour appeler les app settingsvaleurs des deux fichiers de configuration: System.Configuration.ConfigurationSettings.AppSettings ["Key"]

Wavare Santosh
la source
Il est également possible d'utiliser System.Configuration.COnfigurationSettings.AppSettings.Get("Key")au lieu d'utiliser les crochets.
Mason
7

Comme j'ai trouvé la meilleure approche pour accéder aux variables de paramètres d'application de manière systématique en créant une classe wrapper sur System.Configuration comme ci-dessous

public class BaseConfiguration
{
    protected static object GetAppSetting(Type expectedType, string key)
    {
        string value = ConfigurationManager.AppSettings.Get(key);
        try
        {
            if (expectedType == typeof(int))
                return int.Parse(value);
            if (expectedType == typeof(string))
                return value;

            throw new Exception("Type not supported.");
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.",
                key, expectedType), ex);
        }
    }
}

Maintenant, nous pouvons accéder aux variables de paramètres nécessaires par des noms codés en dur en utilisant une autre classe comme ci-dessous:

public class ConfigurationSettings:BaseConfiguration
{
    #region App setting

    public static string ApplicationName
    {
        get { return (string)GetAppSetting(typeof(string), "ApplicationName"); }
    }

    public static string MailBccAddress
    {
        get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); }
    }

    public static string DefaultConnection
    {
        get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); }
    }

    #endregion App setting

    #region global setting


    #endregion global setting
}
Ashwini Jindal
la source
Cette méthode utilise la méthode indiquée par l'OP comme marquée comme obsolète.
user2864740
4

Je vous recommande fortement de créer un wrapper pour cet appel. Quelque chose comme un ConfigurationReaderServiceet utiliser l' injection de dépendance pour obtenir cette classe. De cette façon, vous pourrez isoler ces fichiers de configuration à des fins de test.

Utilisez donc la ConfigurationManager.AppSettings["something"];suggestion et renvoyez cette valeur. Avec cette méthode, vous pouvez créer une sorte de retour par défaut si aucune clé n'est disponible dans le fichier .config.

Custodio
la source
3
Microsoft a déjà un Bulit de manière à gérer plusieurs versions du même fichier de configuration: configurations de construction , qui permettent d' avoir des fichiers de configuration séparés pour chaque configuration de construction: app.DEBUG.config, app.RELEASE.configet app.TEST.config, etc.
jpaugh
4

Vous pouvez également utiliser Formo :

Configuration:

<appSettings>
    <add key="RetryAttempts" value="5" />
    <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
</appSettings>

Code:

dynamic config = new Configuration();
var retryAttempts1 = config.RetryAttempts;                 // Returns 5 as a string
var retryAttempts2 = config.RetryAttempts(10);             // Returns 5 if found in config, else 10
var retryAttempts3 = config.RetryAttempts(userInput, 10);  // Returns 5 if it exists in config, else userInput if not null, else 10
var appBuildDate = config.ApplicationBuildDate<DateTime>();
bombardier
la source
5
Pourquoi diable voudriez-vous faire cela?
lukejkw
3

Juste pour être complet, il existe une autre option disponible pour les projets Web uniquement: System.Web.Configuration.WebConfigurationManager.AppSettings ["MySetting"]

L'avantage de ceci est qu'il ne nécessite pas l'ajout d'une référence supplémentaire, il peut donc être préférable pour certaines personnes.

rdans
la source
3

Étape 1: Faites un clic droit sur l'onglet références pour ajouter une référence.

Étape 2: cliquez sur l'onglet Assemblages

Étape 3: Recherchez «System.Configuration»

Étape 4: cliquez sur OK.

Ensuite, cela fonctionnera.

 string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];
Jitendra Suthar
la source
2

Je crée toujours une interface IConfig avec des propriétés typesafe déclarées pour toutes les valeurs de configuration. Une classe d'implémentation Config encapsule ensuite les appels à System.Configuration. Tous vos appels System.Configuration sont maintenant au même endroit, et il est tellement plus facile et plus propre de conserver et de suivre les champs utilisés et de déclarer leurs valeurs par défaut. J'écris un ensemble de méthodes d'assistance privées pour lire et analyser les types de données courants.

En utilisant un framework IoC , vous pouvez accéder aux champs IConfig n'importe où dans votre application en passant simplement l'interface à un constructeur de classe. Vous pouvez également ensuite créer des implémentations simulées de l'interface IConfig dans vos tests unitaires afin que vous puissiez désormais tester différentes valeurs de configuration et combinaisons de valeurs sans avoir à toucher votre fichier App.config ou Web.config.

Tony O'Hagan
la source
1

Une autre solution possible:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
sherite
la source
1

J'essaie de trouver un correctif pour ce même problème depuis quelques jours maintenant. J'ai pu résoudre ce problème en ajoutant une clé dans la balise appsettings du fichier web.config . Cela devrait remplacer le fichier .dll lors de l'utilisation de l'aide.

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>
Jason
la source
1

Vous pouvez utiliser la ligne ci-dessous. Dans mon cas, cela fonctionnait: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

Vous devez vous assurer que la ligne de code ci-dessus est également l'ancienne version et qu'elle est obsolète dans les nouvelles bibliothèques.

Mohammad D
la source
1

Le ConfigurationManager n'est pas ce dont vous avez besoin pour accéder à vos propres paramètres.

Pour ce faire, vous devez utiliser

{YourAppName}.Properties.Settings.{settingName}

martin c
la source
1

J'ai pu faire fonctionner l'approche ci-dessous pour les projets .NET Core:

Pas:

  1. Créez un appsettings.json (format indiqué ci-dessous) dans votre projet.
  2. Créez ensuite une classe de configuration. Le format est fourni ci-dessous.
  3. J'ai créé une méthode Login () pour montrer l'utilisation de la classe de configuration.

    Créez appsettings.json dans votre projet avec du contenu:

    {
      "Environments": {
        "QA": {
          "Url": "somevalue",
     "Username": "someuser",
          "Password": "somepwd"
      },
      "BrowserConfig": {
        "Browser": "Chrome",
        "Headless": "true"
      },
      "EnvironmentSelected": {
        "Environment": "QA"
      }
    }
    
    public static class Configuration
    {
        private static IConfiguration _configuration;
    
        static Configuration()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json");
    
            _configuration = builder.Build();
    
        }
        public static Browser GetBrowser()
        {
    
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
            {
                return Browser.Firefox;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
            {
                return Browser.Edge;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
            {
                return Browser.InternetExplorer;
            }
            return Browser.Chrome;
        }
    
        public static bool IsHeadless()
        {
            return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
        }
    
        public static string GetEnvironment()
        {
            return _configuration.GetSection("EnvironmentSelected")["Environment"];
        }
        public static IConfigurationSection EnvironmentInfo()
        {
            var env = GetEnvironment();
            return _configuration.GetSection($@"Environments:{env}");
        }
    
    }
    
    
    public void Login()
    {
        var environment = Configuration.EnvironmentInfo();
        Email.SendKeys(environment["username"]);
        Password.SendKeys(environment["password"]);
        WaitForElementToBeClickableAndClick(_driver, SignIn);
    }
user3534040
la source
1

Si vous avez besoin / envie d'utiliser la ConfigurationManagerclasse ...

Vous devrez peut-être charger System.Configuration.ConfigurationManagerpar Microsoft via NuGet Package Manager

Outils-> NuGet Package Manager-> Gérer les packages NuGet pour la solution ...

Microsoft Docs

Une chose à noter dans les documents ...

Si votre application a besoin d'un accès en lecture seule à sa propre configuration, nous vous recommandons d'utiliser la méthode GetSection (String). Cette méthode permet d'accéder aux valeurs de configuration mises en cache pour l'application actuelle, qui ont de meilleures performances que la classe Configuration.

Chris Catignani
la source
0

Veuillez vérifier la version .NET sur laquelle vous travaillez. Il doit être supérieur à 4. Et vous devez ajouter la bibliothèque système System.Configuration à votre application.

nayanajith
la source
3
Cette question a été posée il y a plus de 9 ans, et a déjà plus de 20 réponses, dont 2 qui ont chacune plus de 600 votes positifs, la réponse acceptée est d'ajouter une référence à System.Configuration. Cette réponse supplémentaire n'ajoute pas de valeur. Au mieux, cela devrait être un commentaire sur la réponse acceptée.
Richardissimo
Re "supérieur à 4" : en numéro de version majeur? Ou voulez-vous dire "supérieur à 4,0" ? Ou en d'autres termes, de quel côté serait .NET Framework 4.5 ?
Peter Mortensen
-8

Voici un exemple: App.config

<applicationSettings>
    <MyApp.My.MySettings>
        <setting name="Printer" serializeAs="String">
            <value>1234 </value>
        </setting>
    </MyApp.My.MySettings>
</applicationSettings>

Dim strPrinterName as string = My.settings.Printer
JMat
la source