ConfigurationManager.AppSettings est-il disponible dans .NET Core 2.0?

143

J'ai une méthode qui lit les paramètres de mon fichier de configuration comme ceci:

var value = ConfigurationManager.AppSettings[key];

Il se compile correctement lorsque vous ciblez .NET Standard 2.0 uniquement.

Maintenant, j'ai besoin de plusieurs cibles, j'ai donc mis à jour mon fichier de projet avec:

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

Mais maintenant, la compilation échoue netcoreapp2.0avec le message d'erreur suivant:

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

Séparément, j'ai créé une nouvelle application de console .NET Core 2.0 (ciblant uniquement .NET Core 2.0 cette fois), mais de même, il ne semble pas y avoir ConfigurationManagersous l'espace de noms System.Configuration.

Je suis assez confus car il est disponible sous .NET Standard 2.0, donc je m'attendrais à ce qu'il soit disponible dans .NET Core 2.0, car .NET Core 2.0 est compatible .NET Standard 2.0.

Qu'est-ce que je rate?

Alex Sanséau
la source
11
Vous êtes probablement manquer ce . (Notez qu'une cible .NET Standard couvre à la fois .NET et .NET Core, il n'est donc vraiment pas nécessaire de les construire séparément.)
Jeroen Mostert
Merci @JeroenMostert, l'ajout du package NuGet System.Configuration.ConfigurationManager a résolu le problème. Maintenant, c'est probablement une question distincte, mais comment .NET Core 2.0 est-il considéré comme conforme à .NET Standard 2.0 si l'on a besoin d'ajouter des packages pour polyfill les bits manquants?
Alex Sanséau
2
«Conforme à .NET Standard 2.0» signifie «si vous créez ceci pour cibler .NET Standard 2.0, il fonctionnera sur .NET Core 2.0 (entre autres plates-formes)». Cela ne signifie pas "si vous créez ceci pour cibler .NET Core 2.0, toutes les API .NET Standard 2.0 seront disponibles sans autre action". Si vous construisez cela .NET 2.0 standard et il ne fonctionnera pas sur le Core .NET, alors vous avez raison de se plaindre, mais je pense que cela va tout simplement travailler. (Je ne l'ai pas testé, cependant.)
Jeroen Mostert
4
@ AlexSanséau Les packages NuGet ne sont pas des poly-remplissages. Lors du démarrage des travaux sur .NET Core, Microsoft a pris la décision d'activer les API, ce qui signifie que vos applications ont une empreinte plus petite. Je recommanderais de prendre un peu de temps et de regarder les vidéos créées par Immo Landwerth sur .NET Standard ( youtube.com/… ) - il est le PM de l'équipe .NET Standard
Jamie Taylor
1
RE: It compiles fine when targeting .NET Standard 2.0 only- cela ne peut pas être correct, car ConfigurationManagerne fait pas partie de .NET Standard (jusqu'à présent, cela est vrai jusqu'à v.2.1).
G.Stoynev le

Réponses:

268

Oui, ConfigurationManager.AppSettingsest disponible dans .NET Core 2.0 après avoir référencé le package NuGet System.Configuration.ConfigurationManager.

Les crédits vont à @JeroenMostert pour m'avoir donné la solution.

Alex Sanséau
la source
1
Pouvez-vous publier le code de votre fichier de configuration? J'essaie de comprendre comment / où j'ai défini une variable globale dans .NET Core 2.0
egmfrs
1
@egmfrs, pourriez-vous reformuler s'il vous plaît? Les variables globales existeraient sous la forme de propriétés statiques d'une classe. Les fichiers de configuration contiennent les paramètres de l'application est leur format habituel:<add key="YourSetting" value="YourValue" />
Alex Sanséau
2
@ AlexSanséau, j'essaie de savoir où puis-je définir les valeurs pour AppSettings. web.config ou appsettings.json ne fonctionne pas. Pourriez-vous donner un exemple où définir AppSettings? Merci.
Jan Deutschl
2
@JanDeutschl, il doit aller dans la section appSettings de votre web.config ou app.config, comme vous le feriez pour un projet .NET traditionnel.
Alex Sanséau
8
Je suis un peu confus. Cela fait la liste .NET Framework 4.6comme une dépendance. Cela signifie-t-il que mon projet `.NET Core` n'est plus un Coreprojet pur ?
James Poulose
20

J'ai installé à System.Configuration.ConfigurationManagerpartir de Nuget dans mon application .net core 2.2.

Je référence alors using System.Configuration;

Ensuite, j'ai changé

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

Jusqu'à présent, je pense que c'est correct. 4.5.0 is typical with .net core 2.2

Je n'ai eu aucun problème avec cela.

Tom Stickel
la source
L'une des solutions faciles à effectuer pour la migration. Certains des autres ne sont pas si amusants: /
Tom Stickel
avez-vous également créé un fichier web.config?
swedish_junior_dev
2
cela ne fonctionne pas pour moi (.net core 3.1). il n'a aucune donnée de paramètres si l'accès
arteny
@Arteny - Je ne l'ai jamais testé avec 3.1 - J'ai installé 3.1 et joué avec chez moi - mais mon client actuel ne veut pas mettre à jour de si tôt.
Tom Stickel le
9

Une fois que vous avez configuré les packages, vous devrez créer un app.config ou web.config et ajouter quelque chose comme ce qui suit:

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

Le dernier ensemble de conseils est le suivant: (à partir de https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables )

Utilisation:

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

À partir de la documentation:

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

Les paramètres d'application peuvent être lus à partir des variables d'environnement lors du développement local et lors de l'exécution dans Azure. Lors du développement local, les paramètres de l'application proviennent de la Valuescollection du fichier local.settings.json . Dans les deux environnements, local et Azure, GetEnvironmentVariable("<app setting name>")récupère la valeur du paramètre d'application nommé. Par exemple, lorsque vous exécutez localement, "My Site Name" sera renvoyé si votre fichier local.settings.json contient { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } }.

La propriété System.Configuration.ConfigurationManager.AppSettings est une API alternative pour obtenir les valeurs de paramètre d'application, mais nous vous recommandons de l'utiliser GetEnvironmentVariablecomme indiqué ici.

Nate Radebaugh
la source
Pour tous ceux qui essaient cela, vous obtenez une syntaxe similaire à l'exemple de Microsoft en déclarant ceci:using static System.Environment;
MattMakes
1

Vous pouvez utiliser la configuration pour résoudre ce problème.

Ex (Startup.cs):

Vous pouvez passer par DI aux contrôleurs après cette implémentation.

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
la source