web-dev-qa-db-de.com

So lesen Sie die Datei web.config in der .Net Core-App

Ich habe eine .Net Core API erstellt und eine .Net Framework-Anwendung darauf verwiesen. Die referenzierte Anwendung stellt eine Verbindung zu einer Datenbank her und ihre Verbindungszeichenfolge wird in der Datei web.config gespeichert:

    string CONNSTR =ConfigurationManager.ConnectionStrings["SHOPPINGCNN"].ConnectionString;

Die .Net Core-Anwendung verwendet appsettings.json anstelle der Datei web.config. Wenn ich die API ausführe und versuche, die referenzierten Anwendungsressourcen zu verwenden, wird der obige Code ausgelöst und null zurückgegeben, da in der .net Core-App keine web.config-Datei vorhanden ist. Was ist die beste Lösung, um dieses Problem zu beheben?

17
Zuhair

Da .Net Core-Anwendungen selbst gehostet werden und fast auf jeder Plattform ausgeführt werden können, werden sie nicht mehr auf ISS gehostet. Die .Net Core-Anwendungseinstellungen werden standardmäßig im Format Json (appsettings.json) gespeichert, während .Net Framework-Anwendungskonfigurationen in einer web.config -Datei im Format XML gespeichert werden . Weitere Informationen zu .NET Core-Anwendungen finden Sie unter Konfiguration in ASP.NET Core . In meinem Fall habe ich versucht, von einer .Net Core 2.0-Assembly aus auf die Datenschicht einer .Net Framework-Assembly zuzugreifen. Um dies zu erreichen, muss das Paket System.Configuration.ConfigurationManager in nicht installiert werden Die .Net Core-Anwendung, aber Sie müssen der .Net Core-Assembly nur app.config hinzufügen und dann die Verbindungszeichenfolge hinzufügen:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="SHOPPINGCNN" connectionString="server=your server name;integrated security=true;database=your database name" />
  </connectionStrings>
</configuration>

und alles wird gut funktionieren. Stellen Sie sicher, dass Sie denselben Namen für die Verbindungszeichenfolge verwenden (SHOPPINGCNN in meinem Fall), den Sie in Ihrer .Net Framework-Anwendung verwendet haben. Andernfalls erhalten Sie nicht das gewünschte Ergebnis. Ich habe das in meinem Projekt gemacht und es funktioniert zu 100%

10
Zuhair

in .NET Core können Sie mit ConfigurationBuilder die Datei appsettings.json lesen.

Sie können wie folgt implementieren.

Beispiel für appsettings.json

{
  "option1": "value1_from_json",
  "option2": 2,

  "ConnectionStrings": {
    "YourConnectionString": "............."
  }
}

C # -Codebeispiel

static class YourClass
{
    public static IConfigurationRoot Configuration;

    public static string GetConnectionString()
    {
         var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json");

         Configuration = builder.Build();
         var connectionString = Configuration["ConnectionStrings:YourConnectionString"];

    }

}
10
hasan

Für .NET Core-Apps verwenden Sie am besten die Konfigurations-API . Dies ist ein sehr flexibler Weg, und dank des Providermusters können andere Quellen verwendet werden, nicht nur die häufigste appsettings.json - Datei (die übrigens nur eine JSON-Datei ist und willkürlich benannt werden kann) ):

  • Dateiformate (INI, JSON und XML)
  • Kommandozeilenargumente
  • Umgebungsvariablen
  • In-Memory-.NET-Objekte
  • Ein verschlüsselter Benutzerspeicher Azure Key Vault
  • Benutzerdefinierte Anbieter, die Sie installieren oder erstellen

Nun zu ConfigurationManager. Zunächst musste der .NET Core diese Klasse vergessen - sie wurde nicht implementiert und unterstützt und sollte vollständig durch die Bereitstellung einer neuen Konfigurations-API ersetzt werden.

In Wirklichkeit werden ASP.NET Core-Apps nicht mehr über IIS) gehostet (IIS funktioniert jetzt hauptsächlich als Reverse-Proxy), und daher ist das web.config Nicht mehr so Nützlich mehr (außer in seltenen Fällen, wenn Sie noch spezifische Parameter für die IIS Konfiguration) definieren müssen).

Nachdem .NET Standard 2.0 bereitgestellt wurde, ist dieses Nuget-Paket System.Configuration.ConfigurationManager verfügbar, das die Klasse ConfigurationManager zurückbringt. Möglich wurde dies durch die Implementierung von Compatibility Shim in .NET Core 2.0.

In Bezug auf Ihren Fall ist es schwierig zu sagen, warum Sie 'null' haben, da es nicht genug Informationen gibt:

  • möglicherweise handelt es sich um einen falschen Abschnitt in der Datei web.config
  • web.config kann möglicherweise nicht in Ihren Ausgabe-/Veröffentlichungsordner kopiert werden
7
Set

Für den Fall, dass Sie es verpasst haben - und weil @Zuhair anscheinend keine Antwort veröffentlichen möchte - hier eine Kopie der Lösung (ich habe dies zunächst verpasst, da es nur in einem Kommentar war):

Ich habe die Lösung gefunden. Ich habe den Namen der Web.config in app.config geändert und konnte die Verbindungszeichenfolge folgendermaßen abrufen:

System.Configuration.ConfigurationManager.ConnectionStrings ["SHOPPINGCNN"]. ConnectionString

Die app.config-Datei sieht folgendermaßen aus:

<?xml version="1.0"> encoding="utf-8" ?> 
<configuration> 
<connectionStrings> 
<add name="SHOPPINGCNN" connectionString="server=.\SQLEXPRESS;integrated security=true;database=xxxxx" /> 
</connectionStrings> 
</configuration>

Sie müssen auch dieses NuGet-Paket installieren:

System.Configuration.ConfigurationManager

In meinem Fall habe ich einfach die web.config mit dem connectionString 'app.config' umbenannt und es hat funktioniert.

Mir ist klar, dass dies wahrscheinlich keine gute langfristige Lösung ist, aber für gemischte Legacy-Projekte - oder um einen Fuß in die Tür zu bekommen, ist es sehr nützlich, .net Core zu lernen.

6
niico