Ist ConfigurationManager.AppSettings in .NET Core 2.0 verfügbar?

142

Ich habe eine Methode, die Einstellungen aus meiner Konfigurationsdatei wie folgt liest:

var value = ConfigurationManager.AppSettings[key];

Es wird gut kompiliert, wenn nur auf .NET Standard 2.0 abgezielt wird.

Jetzt brauche ich mehrere Ziele, also habe ich meine Projektdatei aktualisiert mit:

<TargetFrameworks>netcoreapp2.0;net461;netstandard2.0</TargetFrameworks>

Jetzt schlägt die Kompilierung jedoch netcoreapp2.0mit der folgenden Fehlermeldung fehl :

Error   CS0103  The name 'ConfigurationManager' does not exist in the current context   (netcoreapp2.0)

Separat habe ich eine neue .NET Core 2.0-Konsolenanwendung erstellt (diesmal nur für .NET Core 2.0), aber es scheint auch keine ConfigurationManagerunter dem Namespace zu geben System.Configuration.

Ich bin ziemlich verwirrt, weil es unter .NET Standard 2.0 verfügbar ist. Daher würde ich erwarten, dass es in .NET Core 2.0 verfügbar ist, da .NET Core 2.0 .NET Standard 2.0-kompatibel ist.

Was vermisse ich?

Alex Sanséau
quelle
10
Sie vermissen das wahrscheinlich . (Beachten Sie, dass ein .NET Standard-Ziel sowohl .NET als auch .NET Core abdeckt , sodass es wirklich nicht erforderlich ist, diese auch separat zu erstellen.)
Jeroen Mostert
Dank @JeroenMostert wurde das Problem durch Hinzufügen des NuGet-Pakets System.Configuration.ConfigurationManager behoben. Dies ist wahrscheinlich eine separate Frage, aber wie wird .NET Core 2.0 als .NET Standard 2.0-konform eingestuft, wenn Pakete hinzugefügt werden müssen, um die fehlenden Bits zu füllen?
Alex Sanséau
2
".NET Standard 2.0-kompatibel" bedeutet "Wenn Sie dies für .NET Standard 2.0 erstellen, wird es unter anderem auf .NET Core 2.0 ausgeführt". Dies bedeutet nicht, dass "Wenn Sie dies für .NET Core 2.0 erstellen, sind alle .NET Standard 2.0-APIs ohne weitere Maßnahmen verfügbar". Wenn Sie dies .NET Standard - Aufbau 2.0 und es wird auf .NET - Core nicht ausgeführt, dann haben Sie Grund zur Beanstandung, aber ich denke , das nur an der Arbeit geht. (Ich habe es jedoch nicht getestet.)
Jeroen Mostert
4
@ AlexSanséau Die NuGet-Pakete sind keine Poly-Fills. Zu Beginn der Arbeit an .NET Core hat Microsoft die Entscheidung getroffen, die APIs zu aktivieren, was bedeutet, dass Ihre Anwendungen einen geringeren Platzbedarf haben. Ich würde empfehlen, sich etwas Zeit zu nehmen und die Videos anzusehen, die Immo Landwerth auf .NET Standard ( youtube.com/… ) erstellt hat - er ist der PM im .NET Standard-Team
Jamie Taylor
1
RE: It compiles fine when targeting .NET Standard 2.0 only- Dies kann nicht korrekt sein, da ConfigurationManageres nicht Teil von .NET Standard ist (bisher gilt dies bis Version 2.1).
G. Stoynev

Antworten:

268

Ja, ConfigurationManager.AppSettingsist in .NET Core 2.0 verfügbar, nachdem auf das NuGet-Paket verwiesen wurde System.Configuration.ConfigurationManager.

Dank geht an @JeroenMostert, um mir die Lösung zu geben.

Alex Sanséau
quelle
1
Können Sie eine Code aus Ihrer Konfigurationsdatei veröffentlichen? Ich versuche herauszufinden, wie / wo ich eine globale Variable in .NET Core 2.0 festgelegt habe
egmfrs
1
@egmfrs, würde es Ihnen etwas ausmachen, bitte neu zu formulieren? Globale Variablen würden in Form statischer Eigenschaften einer Klasse existieren. Konfigurationsdateien enthalten Anwendungseinstellungen ist ihr übliches Format:<add key="YourSetting" value="YourValue" />
Alex Sanséau
2
@ AlexSanséau, ich versuche herauszufinden, wo ich die Werte für AppSettings festlegen kann. web.config oder appsettings.json funktioniert nicht. Können Sie ein Beispiel geben, wo AppSettings festgelegt werden? Vielen Dank.
Jan Deutschl
2
@JanDeutschl, es sollte in den Abschnitt appSettings Ihrer web.config oder app.config gehen, wie Sie es für ein traditionelles .NET-Projekt tun würden.
Alex Sanséau
8
Ich bin etwas verwirrt. Dies wird .NET Framework 4.6als Abhängigkeit aufgeführt. Bedeutet das, dass mein .NET Core-Projekt kein reines CoreProjekt mehr ist?
James Poulose
20

Ich habe System.Configuration.ConfigurationManagervon Nuget in meine .net Core 2.2-Anwendung installiert .

Ich beziehe mich dann using System.Configuration;

Als nächstes habe ich mich verändert

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

Bisher halte ich das für richtig. 4.5.0 is typical with .net core 2.2

Ich hatte keine Probleme damit.

Tom Stickel
quelle
Eine der einfachen Korrekturen für die Migration. Einige der anderen sind nicht so lustig: /
Tom Stickel
Haben Sie auch eine web.config-Datei erstellt?
swedish_junior_dev
2
es funktioniert nicht bei mir (.net core 3.1). es hat keine irgendwelche Einstellungsdaten , wenn der Zugriff
arteny
@Arteny - Ich habe es nie mit 3.1 getestet - Ich habe 3.1 installiert und zu Hause damit gespielt - aber mein aktueller Client möchte nicht so schnell ein Upgrade durchführen.
Tom Stickel
8

Sobald Sie die Pakete eingerichtet haben, müssen Sie entweder eine app.config oder eine web.config erstellen und Folgendes hinzufügen:

<configuration>
  <appSettings>
    <add key="key" value="value"/>
  </appSettings>
</configuration>
Sharpiro
quelle
7

Die neuesten Anleitungen lauten wie folgt: (von https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables )

Verwenden:

System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);

Aus den Dokumenten:

public static class EnvironmentVariablesExample
{
    [FunctionName("GetEnvironmentVariables")]
    public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
        log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
    }

    public static string GetEnvironmentVariable(string name)
    {
        return name + ": " +
            System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
    }
}

App-Einstellungen können sowohl bei der lokalen Entwicklung als auch bei der Ausführung in Azure aus Umgebungsvariablen gelesen werden. Bei der lokalen Entwicklung stammen die App-Einstellungen aus der ValuesSammlung in der Datei local.settings.json . Ruft in beiden Umgebungen, lokal und Azure, GetEnvironmentVariable("<app setting name>")den Wert der benannten App-Einstellung ab. Wenn Sie beispielsweise lokal ausgeführt werden, wird "Mein Site-Name" zurückgegeben, wenn Ihre Datei local.settings.json enthält{ "Values": { "WEBSITE_SITE_NAME": "My Site Name" } } .

Die Eigenschaft System.Configuration.ConfigurationManager.AppSettings ist eine alternative API zum Abrufen von App-Einstellungswerten. Wir empfehlen jedoch, diese GetEnvironmentVariablewie hier gezeigt zu verwenden.

Nate Radebaugh
quelle
Für alle, die dies ausprobieren, erhalten Sie eine ähnliche Syntax wie im Microsoft-Beispiel, indem Sie using static System.Environment;
Folgendes
1

Sie können die Konfiguration verwenden, um dies zu beheben.

Beispiel (Startup.cs):

Nach dieser Implementierung können Sie DI an die Controller übergeben.

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        Configuration = builder.Build();

    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {

        var microserviceName = Configuration["microserviceName"];

       services.AddSingleton(Configuration);

       ...
    }
Frederico Freitas
quelle