Lecture d'une clé à partir de Web.Config à l'aide de ConfigurationManager

284

J'essaie de lire les clés du Web.configfichier dans une couche différente de la couche Web (même solution)

Voici ce que j'essaye:

string userName = System.Configuration.ConfigurationManager.AppSettings["PFUserName"];
string password = System.Configuration.ConfigurationManager.AppSettings["PFPassWord"];

Et voici mon appSettingsdans le Web.configdossier:

<configuration>
   ....
   <appSettings>
      <add key="PFUserName" value="myusername"/>
      <add key="PFPassWord" value="mypassword"/>
   </appSettings>
   ....
</configuration>

Lorsque je débogue le code usernameet que je suis passwordjuste null, il n'obtient pas la valeur des clés.

Que fais-je de mal à lire ces valeurs?

twal
la source
Comment ce deuxième projet est-il accessible par votre site Web?
Dan Atkinson
13
Votre syntaxe est correcte . Vous avez probablement modifié le mauvais fichier web.config, c'est pourquoi il revient NULL. Commentaire tardif mais personne ne l'a signalé.
Hammad Khan
1
C'est ce qui m'est arrivé, j'étais dans le web.config Views.
JQII
1
Seul le projet Web a accès à l'objet System.Configuration.ConfigurationManager.AppSettings. Les autres couches ne peuvent pas accéder à cet objet car elles n'implémentent pas System.Web.
Hashim Akhtar

Réponses:

476

Essayez plutôt d'utiliser la classe WebConfigurationManager. Par exemple:

string userName = WebConfigurationManager.AppSettings["PFUserName"]
Hector Correa
la source
2
Merci pour votre réponse, j'ai essayé comme vous l'avez recommandé et obtenez toujours le même résultat. En fait, je reçois maintenant une exception NullReferenceException sur le ToString ()
twal
Si vous obtenez une exception nulle, cela signifie qu'il ne trouve pas le paramètre. Essayez de faire quelque chose comme ceci: "object x = WebConfigurationManager.AppSettings [" PFUserName "];" et vous obtiendrez probablement une valeur nulle, ce qui signifie qu'il ne trouve pas le paramètre demandé.
Hector Correa
21
Êtes-vous sûr que les paramètres sont sur le bon fichier web.config? (J'ai fait l'erreur avant de vider mes valeurs dans le web.config sous le dossier "Views" et j'ai perdu une tonne de temps à dépanner pourquoi cela ne fonctionnait pas comme prévu.
Hector Correa
Génial. Je suis content que ce soit le cas.
Hector Correa
4
Merci. Vous pouvez supprimer la ToString car l'indexeur AppSettings renvoie déjà une chaîne.
Ido Ran
43
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];
yogeswaran K
la source
12
Bonne réponse. ToString()est redondant cependant.
anar khalilov
9
ToString peut être dangereux si la valeur n'est pas dans la configuration de l'application. Mieux vaut piéger l'objet retourné et tester null avant de le résoudre. Essayez de l'exécuter lorsque "mysettings" n'est pas dans la configuration et vous verrez la pop d'exception. Au lieu de cela, quelque chose comme ce qui est ci-dessous pourrait être plus sûr ... string key = "mysettings"; valeur de chaîne = ConfigurationManager.AppSettings [clé]; if (value == null) value = "unknown value";
Joe Healy
1
vrai, il n'y a pas besoin de .ToString () car c'est une chaîne
Rola
2
@JoeHealy Vous pouvez raccourcir cela et augmenter la clarté avec l'opérateur de coalescence nul:string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
Zenexer
Je me demande quelle est la différence entre cette réponse et le code de la question OP! N'est-ce pas la même chose?
user1451111
6

Si l'appelant est un autre projet, vous devez écrire la configuration dans le projet d'appelant et non celui appelé.

Sabre
la source
6

J'ai trouvé cette solution très utile . Il utilise C # 4.0 DynamicObject pour encapsuler le ConfigurationManager. Donc, au lieu d'accéder à des valeurs comme celle-ci:

 WebConfigurationManager.AppSettings["PFUserName"]

vous y accédez en tant que propriété:

dynamic appSettings = new AppSettingsWrapper();
Console.WriteLine(appSettings.PFUserName);  

EDIT : Ajout d'extrait de code au cas où le lien deviendrait périmé:

public class AppSettingsWrapper : DynamicObject
{
     private NameValueCollection _items;

    public AppSettingsWrapper()
    {
        _items = ConfigurationManager.AppSettings;
    }

     public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = _items[binder.Name];
        return result != null;
    }
}
mateuscb
la source
2

Chemin complet car c'est

System.Configuration.ConfigurationManager.AppSettings["KeyName"]
Siddhartha
la source
2

Il y aura deux fichiers Web.config. Je pense que vous avez peut-être confondu avec ces deux fichiers.

Vérifiez cette image:

cliquez sur ce lien et vérifiez cette image

Dans cette image, vous pouvez voir deux fichiers Web.config. Vous devez ajouter vos constantes à celle qui se trouve dans le dossier du projet et non dans le dossier des vues

J'espère que cela peut vous aider

raja gangadhar
la source
1

Ce problème se produit si ce projet est utilisé par un autre projet. Assurez-vous de copier les clés de configuration de l'application dans app.config ou web.config du projet parent.

Karthikeyan Muthu
la source
1

Vous pouvez également essayer cette ligne pour obtenir la valeur de chaîne du app.configfichier.

var strName= ConfigurationManager.AppSettings["stringName"];
Ram Beer Singh
la source
0

avec l'hypothèse ci-dessous dans le fichier .config:

<configuration>
   <appSettings>
     <add key="PFUserName" value="myusername"/>
     <add key="PFPassWord" value="mypassword"/>
   </appSettings> 
</configuration>

essaye ça:

public class myController : Controller
{
    NameValueCollection myKeys = ConfigurationManager.AppSettings;

    public void MyMethod()
    {
        var myUsername = myKeys["PFUserName"];
        var myPassword = myKeys["PFPassWord"];
    }
}
Aiyoub Amini
la source
-5

Désolé, je n'ai pas testé cela, mais je pense que c'est fait comme ceci:

var filemap = new System.Configuration.ExeConfigurationFileMap();            
System.Configuration.Configuration config =  System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(filemap, System.Configuration.ConfigurationUserLevel.None);

//usage: config.AppSettings["xxx"]
Lee Smith
la source