Lesen eines Schlüssels aus der Web.Config mit ConfigurationManager

284

Ich versuche, die Schlüssel aus der Web.configDatei in einer anderen Ebene als der Webebene zu lesen (gleiche Lösung)

Folgendes versuche ich:

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

Und hier ist meine appSettingsin der Web.configDatei:

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

Wenn ich den Code debugge usernameund passwordnur bin null, erhält er nicht den Wert der Schlüssel.

Was mache ich falsch, um diese Werte zu lesen?

twal
quelle
Wie wird auf Ihr zweites Projekt von Ihrer Website zugegriffen?
Dan Atkinson
13
Ihre Syntax ist korrekt . Sie haben wahrscheinlich die falsche Datei web.config bearbeitet, weshalb sie zurückgegeben wird NULL. Später Kommentar, aber niemand hat darauf hingewiesen.
Hammad Khan
1
Das ist mir passiert, ich war in der Views web.config.
JQII
1
Nur das Webprojekt hat Zugriff auf das Objekt System.Configuration.ConfigurationManager.AppSettings. Andere Ebenen können nicht auf dieses Objekt zugreifen, da sie System.Web nicht implementieren.
Hashim Akhtar

Antworten:

475

Versuchen Sie stattdessen, die WebConfigurationManager-Klasse zu verwenden. Beispielsweise:

string userName = WebConfigurationManager.AppSettings["PFUserName"]
Hector Correa
quelle
2
Vielen Dank für Ihre Antwort. Ich habe versucht, wie Sie empfohlen haben, und trotzdem das gleiche Ergebnis erzielt. Ich bekomme jetzt tatsächlich eine NullReferenceException auf dem ToString ()
Twal
Wenn Sie eine Null-Ausnahme erhalten, bedeutet dies, dass die Einstellung nicht gefunden wird. Versuchen Sie Folgendes: "object x = WebConfigurationManager.AppSettings [" PFUserName "];" und Sie erhalten wahrscheinlich einen Nullwert, was bedeutet, dass die angeforderte Einstellung nicht gefunden wird.
Hector Correa
21
Sind Sie sicher, dass sich die Einstellungen in der richtigen web.config befinden? (Ich habe den Fehler gemacht, meine Werte in der Datei web.config unter dem Ordner "Views" abzulegen, und eine Menge Zeit bei der Fehlerbehebung verloren, warum es nicht wie erwartet funktioniert.
Hector Correa
Toll. Ich bin froh, dass es so war.
Hector Correa
4
Vielen Dank, Sie können den ToString löschen, da der AppSettings-Indexer bereits eine Zeichenfolge zurückgibt.
Ido lief
43
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];
Yogeswaran K.
quelle
12
Richtige Antwort. ToString()ist jedoch überflüssig.
Anar Khalilov
9
ToString kann gefährlich sein, wenn der Wert nicht in der App-Konfiguration enthalten ist. Es ist besser, das zurückgegebene Objekt abzufangen und vor dem Auflösen auf Null zu testen. Versuchen Sie es auszuführen, wenn "mysettings" nicht in der Konfiguration enthalten ist und die Ausnahme angezeigt wird. Stattdessen könnte etwas wie das, was unten steht, sicherer sein ... string key = "mysettings"; Zeichenfolgenwert = ConfigurationManager.AppSettings [Schlüssel]; if (value == null) value = "unbekannter Wert";
Joe Healy
1
wahr, es gibt keine Notwendigkeit für die .ToString (), da es sich um eine Zeichenfolge handelt
Rola
2
@ JoeHealy Sie können das verkürzen und die Klarheit mit dem Null-Koaleszenz-Operator erhöhen:string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
Zenexer
Ich frage mich, was der Unterschied zwischen dieser Antwort und dem Code in der Frage von OP ist! Sind sie nicht gleich?
user1451111
6

Wenn der Aufrufer ein anderes Projekt ist, sollten Sie die Konfiguration in das Aufruferprojekt schreiben, nicht in das aufgerufene.

Säbel
quelle
6

Ich fand diese Lösung sehr hilfreich . Es verwendet C # 4.0 DynamicObject, um den ConfigurationManager zu verpacken. Anstatt auf solche Werte zuzugreifen:

 WebConfigurationManager.AppSettings["PFUserName"]

Sie greifen als Eigenschaft darauf zu:

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

BEARBEITEN : Hinzufügen eines Code-Snippets für den Fall, dass der Link veraltet ist:

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
quelle
2

Voller Weg dafür ist

System.Configuration.ConfigurationManager.AppSettings["KeyName"]
Siddhartha
quelle
2

Es werden zwei Web.config-Dateien vorhanden sein. Ich denke, Sie haben diese beiden Dateien möglicherweise verwechselt.

Überprüfen Sie dieses Bild:

Klicken Sie auf diesen Link und überprüfen Sie dieses Bild

In diesem Bild sehen Sie zwei Web.config-Dateien. Sie sollten Ihre Konstanten zu der Konstante hinzufügen, die sich im Projektordner und nicht im Ansichtsordner befindet

Hoffe das kann dir helfen

Raja Gangadhar
quelle
1

Dieses Problem tritt auf, wenn dieses Projekt von einem anderen Projekt verwendet wird. Stellen Sie sicher, dass Sie die App-Einstellungsschlüssel in die app.config oder web.config des übergeordneten Projekts kopieren.

Karthikeyan Muthu
quelle
1

Sie können diese Zeile auch ausprobieren, um den Zeichenfolgenwert aus der app.configDatei abzurufen.

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

unter der Annahme der folgenden Einstellung in der .config-Datei:

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

Versuche dies:

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

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

Entschuldigung, ich habe das nicht getestet, aber ich denke, es ist so gemacht:

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
quelle