Leggere una chiave da Web.Config usando ConfigurationManager


284

Sto cercando di leggere le chiavi dal Web.configfile in un livello diverso rispetto al livello Web (stessa soluzione)

Ecco cosa sto provando:

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

Ed ecco il mio appSettingsnel Web.configfile:

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

Quando eseguo il debug del codice usernamee passwordsono giusto null, quindi non ottiene il valore delle chiavi.

Cosa sto sbagliando a leggere questi valori?


In che modo questo secondo progetto ha accesso al tuo sito Web?
Dan Atkinson,

13
La tua sintassi è corretta . Probabilmente hai modificato il file web.config errato per questo motivo NULL. Commento in ritardo ma nessuno lo ha sottolineato.
Hammad Khan,

1
Questo è quello che mi è successo, ero nel web.config di Views.
JQII,

1
Solo il progetto Web ha accesso all'oggetto System.Configuration.ConfigurationManager.AppSettings. Altri layer non possono accedere a questo oggetto in quanto non implementano System.Web.
Hashim Akhtar,

Risposte:


475

Prova invece a utilizzare la classe WebConfigurationManager. Per esempio:

string userName = WebConfigurationManager.AppSettings["PFUserName"]

2
Grazie per la tua risposta, ho provato come mi hai consigliato e ho sempre ottenuto lo stesso risultato. In realtà ora ricevo una NullReferenceException sul ToString ()
twal

Se si ottiene un'eccezione nulla, significa che non si trova l'impostazione. Prova a fare qualcosa del genere: "object x = WebConfigurationManager.AppSettings [" PFUserName "];" e probabilmente otterrai un valore nullo, il che significa che non trova l'impostazione richiesta.
Hector Correa,

21
Sei sicuro che le impostazioni siano sul web.config corretto? (Ho fatto l'errore prima di scaricare i miei valori nel web.config nella cartella "Views" e ho perso un sacco di tempo a risolvere il motivo per cui non funziona come previsto.
Hector Correa

Grande. Sono contento di averlo fatto.
Hector Correa,

4
Grazie, puoi eliminare ToString perché l'indicizzatore AppSettings restituisce già una stringa.
Ido ha funzionato il

43
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];

12
Risposta esatta. ToString()è ridondante però.
anar khalilov il

9
ToString può essere pericoloso se il valore non è presente nella configurazione dell'app. Meglio intercettare l'oggetto restituito e testare null prima di risolverlo. Prova a eseguirlo quando "mysettings" non è nella configurazione e vedrai l'eccezione pop. Invece qualcosa come quello che segue potrebbe essere più sicuro ... string key = "mysettings"; valore stringa = ConfigurationManager.AppSettings [chiave]; if (value == null) value = "valore sconosciuto";
Joe Healy,

1
true non è necessario il .ToString () poiché è una stringa
Rola,

2
@JoeHealy Puoi accorciarlo e aumentare la chiarezza con l'operatore a coalescenza nulla:string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
Zenexer

Mi chiedo quale sia la differenza tra questa risposta e il codice nella domanda di OP! Non sono uguali?
utente1451111

6

Se il chiamante è un altro progetto, è necessario scrivere la configurazione nel progetto chiamante non quella chiamata.


6

Ho trovato questa soluzione molto utile . Utilizza DynamicObject C # 4.0 per avvolgere ConfigurationManager. Quindi, invece di accedere a valori come questo:

 WebConfigurationManager.AppSettings["PFUserName"]

accedi a loro come proprietà:

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

EDIT : l'aggiunta di snippet di codice nel caso in cui il collegamento diventi obsoleto

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

2

Percorso completo per lo è

System.Configuration.ConfigurationManager.AppSettings["KeyName"]

2

Ci saranno due file Web.config. Penso che potresti esserti confuso con quei due file.

Controlla questa immagine:

fai clic su questo link e controlla questa immagine

In questa immagine puoi vedere due file Web.config. È necessario aggiungere le costanti a quella che si trova nella cartella del progetto non nella cartella delle viste

Spero che questo possa aiutarti


1

Questo problema si verifica se questo progetto viene utilizzato da un altro progetto. Assicurati di copiare le chiavi di impostazione dell'app in app.config o web.config del progetto principale.


1

Inoltre puoi provare questa linea per ottenere il valore di stringa dal app.configfile.

var strName= ConfigurationManager.AppSettings["stringName"];

0

assumendo le seguenti impostazioni nel file .config:

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

prova questo:

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

    public void MyMethod()
    {
        var myUsername = myKeys["PFUserName"];
        var myPassword = myKeys["PFPassWord"];
    }
}

-5

Mi dispiace non ho provato questo, ma penso che sia fatto così:

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

//usage: config.AppSettings["xxx"]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.