¿ConfigurationManager.AppSettings está disponible en .NET Core 2.0?

143

Tengo un método que lee la configuración de mi archivo de configuración de esta manera:

var value = ConfigurationManager.AppSettings[key];

Se compila bien solo cuando se dirige a .NET Standard 2.0.

Ahora necesito múltiples objetivos, así que actualicé mi archivo de proyecto con:

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

Pero ahora, la compilación falla netcoreapp2.0con el siguiente mensaje de error:

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

Por separado, creé una nueva aplicación de consola .NET Core 2.0 (solo dirigida a .NET Core 2.0 esta vez), pero del mismo modo parece que no hay ninguna ConfigurationManageren el espacio de nombres System.Configuration.

Estoy bastante confundido porque está disponible en .NET Standard 2.0, por lo que esperaría que esté disponible en .NET Core 2.0, ya que .NET Core 2.0 es compatible con .NET Standard 2.0.

¿Qué me estoy perdiendo?

Alex Sanséau
fuente
10
Probablemente te estés perdiendo esto . (Tenga en cuenta que un objetivo estándar .NET cubre tanto .NET como .NET Core, por lo que realmente no hay necesidad de construirlos por separado también.)
Jeroen Mostert
Gracias @JeroenMostert, al agregar el paquete NuGet System.Configuration.ConfigurationManager resolvió el problema. Ahora, esta es probablemente una pregunta separada, pero ¿cómo se considera que .NET Core 2.0 cumple con .NET Standard 2.0 si es necesario agregar paquetes para rellenar los bits faltantes?
Alex Sanséau
2
"Cumple con .NET Standard 2.0" significa "si compila esto para apuntar a .NET Standard 2.0, se ejecutará en .NET Core 2.0 (entre otras plataformas)". No significa "si compila esto para apuntar a .NET Core 2.0, todas las API de .NET Standard 2.0 estarán disponibles sin más acción". Si compila esto a .NET Standard 2.0 y no se ejecutará en .NET Core, entonces tiene motivos para quejarse, pero creo que esto simplemente va a funcionar. (Sin embargo, no lo he probado.)
Jeroen Mostert
44
@ AlexSanséau Los paquetes NuGet no son rellenos de polietileno. Al comenzar a trabajar en .NET Core, Microsoft tomó la decisión de habilitar las API, lo que significa que sus aplicaciones tienen menos espacio. Recomendaría tomarse un tiempo y mirar los videos que Immo Landwerth ha creado en .NET Standard ( youtube.com/… ). Es el primer ministro del equipo de .NET Standard
Jamie Taylor
1
RE: It compiles fine when targeting .NET Standard 2.0 only- esto no puede ser correcto, porque ConfigurationManagerno es parte de .NET Standard (hasta ahora esto es cierto hasta v.2.1).
G. Stoynev

Respuestas:

268

Sí, ConfigurationManager.AppSettingsestá disponible en .NET Core 2.0 después de hacer referencia al paquete NuGet System.Configuration.ConfigurationManager.

Los créditos van a @JeroenMostert por darme la solución.

Alex Sanséau
fuente
1
¿Puedes publicar código de tu archivo de configuración? Estoy tratando de averiguar cómo / dónde configuro una variable global en .NET Core 2.0
egmfrs
1
@egmfrs, ¿te importaría reformular por favor? Las variables globales existirían en forma de propiedades estáticas de una clase. Los archivos de configuración contienen la configuración de la aplicación es su formato habitual:<add key="YourSetting" value="YourValue" />
Alex Sanséau
2
@ AlexSanséau, estoy tratando de averiguar dónde puedo establecer los valores para AppSettings. web.config o appsettings.json no funcionan. ¿Podría dar un ejemplo de dónde configurar AppSettings? Gracias.
Jan Deutschl
2
@ JanDeutschl, debe ir a la sección de configuración de aplicaciones de su web.config o app.config, como lo haría para un proyecto .NET tradicional.
Alex Sanséau
8
Estoy un poco confundido Esto enumera .NET Framework 4.6como una dependencia. ¿Eso significa que mi proyecto `.NET Core` ya no es un Coreproyecto puro ?
James Poulose
20

lo instalé System.Configuration.ConfigurationManager desde Nuget en mi aplicación .net core 2.2.

Entonces hago referencia using System.Configuration;

Luego cambié

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

Hasta ahora creo que esto es correcto. 4.5.0 is typical with .net core 2.2

No he tenido ningún problema con esto.

Tom Stickel
fuente
Una de las soluciones fáciles de hacer para la migración. Algunos de los otros no son tan divertidos: /
Tom Stickel
¿también creaste un archivo web.config?
swedish_junior_dev
2
no funciona para mí (.net core 3.1). no tiene ningún dato de configuración si tiene acceso
arteny
@Arteny: nunca lo probé con 3.1, instalé 3.1 y jugué con él en casa, pero mi cliente actual no quiere actualizar en el corto plazo.
Tom Stickel
9

Una vez que haya configurado los paquetes, deberá crear una app.config o web.config y agregar algo como lo siguiente:

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

El último conjunto de orientación es el siguiente: (de https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables )

Utilizar:

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

De los documentos:

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

La configuración de la aplicación se puede leer desde variables de entorno tanto cuando se desarrolla localmente como cuando se ejecuta en Azure. Cuando se desarrolla localmente, la configuración de la aplicación proviene de la Valuescolección en el archivo local.settings.json . En ambos entornos, local y Azure, GetEnvironmentVariable("<app setting name>")recupera el valor de la configuración de la aplicación con nombre. Por ejemplo, cuando se ejecuta localmente, se devolverá "Nombre de mi sitio" si su archivo local.settings.json contiene { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } }.

La propiedad System.Configuration.ConfigurationManager.AppSettings es una API alternativa para obtener valores de configuración de la aplicación, pero le recomendamos que utilice GetEnvironmentVariablecomo se muestra aquí.

Nate Radebaugh
fuente
Para cualquiera que pruebe esto, obtendrá una sintaxis similar al ejemplo de Microsoft al declarar esto:using static System.Environment;
MattMakes
1

Puede usar la Configuración para resolver esto.

Ej (Startup.cs):

Puede pasar por DI a los controladores después de esta implementación.

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
fuente