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.