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?
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%
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"];
}
}
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:
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.