ConfigurationManager.AppSettings è disponibile in .NET Core 2.0?


143

Ho un metodo che legge le impostazioni dal mio file di configurazione in questo modo:

var value = ConfigurationManager.AppSettings[key];

Si compila bene solo per il targeting di .NET Standard 2.0.

Ora ho bisogno di più target, quindi ho aggiornato il mio file di progetto con:

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

Ma ora la compilazione non riesce netcoreapp2.0con il seguente messaggio di errore:

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

Separatamente, ho creato una nuova applicazione console .NET Core 2.0 (destinata solo a .NET Core 2.0 questa volta), ma allo stesso modo non sembra esserci ConfigurationManagersotto lo spazio dei nomi System.Configuration.

Sono abbastanza confuso perché è disponibile in .NET Standard 2.0, quindi mi aspetto che sia disponibile in .NET Core 2.0, poiché .NET Core 2.0 è conforme a .NET Standard 2.0.

Cosa mi sto perdendo?


11
Probabilmente ti stai perdendo questo . (Si noti che un target .NET standard copre sia .NET che .NET Core, quindi non è necessario crearli separatamente.)
Jeroen Mostert,

Grazie @JeroenMostert, l'aggiunta del pacchetto NuGet System.Configuration.ConfigurationManager ha risolto il problema. Ora, questa è probabilmente una domanda separata, ma in che modo .NET Core 2.0 è considerato conforme a .NET Standard 2.0 se è necessario aggiungere pacchetti per riempire polifunzionalmente i bit mancanti?
Alex Sanséau,

2
"Conforme a .NET Standard 2.0" significa "se lo si crea per target .NET Standard 2.0, verrà eseguito su .NET Core 2.0 (tra le altre piattaforme)". Non significa "se lo costruisci per target .NET Core 2.0, tutte le API di .NET Standard 2.0 saranno disponibili senza ulteriori azioni". Se lo costruisci su .NET Standard 2.0 e non funzionerà su .NET Core, allora hai motivo di lamentarti, ma penso che funzionerà. (Non l'ho ancora testato.)
Jeroen Mostert,

4
@ AlexSanséau I pacchetti NuGet non sono polifillamenti. Quando ha iniziato a lavorare su .NET Core, Microsoft ha deciso di attivare le API, il che significa che le applicazioni hanno un footprint ridotto. Consiglierei di prenderti un po 'di tempo e guardare i video che Immo Landwerth ha creato su .NET Standard ( youtube.com/… ) - è il PM del team .NET Standard
Jamie Taylor il

1
RE: It compiles fine when targeting .NET Standard 2.0 only- questo non può essere corretto, perché ConfigurationManagernon fa parte di .NET Standard (finora questo è vero fino alla v.2.1).
G. Stoynev,

Risposte:


268

Sì, ConfigurationManager.AppSettingsè disponibile in .NET Core 2.0 dopo aver fatto riferimento al pacchetto NuGet System.Configuration.ConfigurationManager.

I crediti vanno a @JeroenMostert per avermi dato la soluzione.


1
Puoi pubblicare codice dal tuo file di configurazione? Sto cercando di capire come / dove ho impostato una variabile globale in .NET Core 2.0
egmfrs

1
@egmfrs, ti dispiacerebbe riformulare per favore? Le variabili globali esisterebbero sotto forma di proprietà statiche di una classe. I file di configurazione contengono le impostazioni dell'applicazione nel loro solito formato:<add key="YourSetting" value="YourValue" />
Alex Sanséau,

2
@ AlexSanséau, sto cercando di capire dove posso impostare i valori per AppSettings. web.config o appsettings.json non funziona. Potresti fare un esempio su dove impostare le Impostazioni app? Grazie.
Jan Deutschl,

2
@ JanDeutschl, dovrebbe andare nella sezione appSettings del tuo web.config o app.config, come faresti per un tradizionale progetto .NET.
Alex Sanséau,

8
Sono un po 'confuso. Questo viene elencato .NET Framework 4.6come dipendenza. Ciò significa che il mio progetto ".NET Core" non è più un Coreprogetto puro ?
James Poulose,

20

Ho installato System.Configuration.ConfigurationManagerda Nuget nella mia applicazione .net core 2.2.

Quindi faccio riferimento using System.Configuration;

Successivamente, ho cambiato

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

Finora credo che sia corretto. 4.5.0 is typical with .net core 2.2

Non ho avuto problemi con questo.


Una delle soluzioni facili da fare per la migrazione. Alcuni degli altri non sono così divertenti: /
Tom Stickel

hai anche creato un file web.config?
swedish_junior_dev

2
non funziona per me (.net core 3.1). non ha alcun dato di impostazione se l'accesso
arteny

@Arteny - Non l'ho mai provato con 3.1 - Ho installato 3.1 e ci ho giocato a casa - ma il mio attuale client non vuole aggiornarlo presto.
Tom Stickel,

9

Dopo aver configurato i pacchetti, dovrai creare un file app.config o web.config e aggiungere qualcosa di simile al seguente:

<configuration>
  <appSettings>
    <add key="key" value="value"/>
  </appSettings>
</configuration>

7

L'ultima serie di indicazioni è la seguente: (da https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables )

Uso:

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

Dai documenti:

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);
    }
}

Le impostazioni dell'app possono essere lette dalle variabili di ambiente sia durante lo sviluppo locale che durante l'esecuzione in Azure. Durante lo sviluppo locale, le impostazioni dell'app provengono dalla Valuesraccolta nel file local.settings.json . In entrambi gli ambienti, locale e Azure, GetEnvironmentVariable("<app setting name>")recupera il valore dell'impostazione dell'app denominata. Ad esempio, quando si esegue localmente, "My Site Name" verrà restituito se il file local.settings.json contiene { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } }.

La proprietà System.Configuration.ConfigurationManager.AppSettings è un'API alternativa per ottenere i valori delle impostazioni dell'app, ma ti consigliamo di utilizzare GetEnvironmentVariablecome mostrato qui.


Per chiunque lo provi, ottieni una sintassi simile all'esempio Microsoft dichiarando questo:using static System.Environment;
MattMakes

1

È possibile utilizzare la configurazione per risolvere questo problema.

Ex (Startup.cs):

È possibile passare DI ai controller dopo questa implementazione.

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);

       ...
    }
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.