O ConfigurationManager.AppSettings está disponível no .NET Core 2.0?

142

Eu tenho um método que lê as configurações do meu arquivo de configuração como este:

var value = ConfigurationManager.AppSettings[key];

Ele é compilado corretamente ao direcionar apenas o .NET Standard 2.0.

Agora, como preciso de vários destinos, atualizei meu arquivo de projeto com:

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

Mas agora, a compilação falha netcoreapp2.0com a seguinte mensagem de erro:

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

Separadamente, criei um novo aplicativo de console do .NET Core 2.0 (desta vez apenas para o .NET Core 2.0), mas da mesma forma parece não existir ConfigurationManagerno namespace System.Configuration.

Estou bastante confuso porque está disponível no .NET Standard 2.0, portanto, espero que esteja disponível no .NET Core 2.0, pois o .NET Core 2.0 é compatível com o .NET Standard 2.0.

o que estou perdendo?

Alex Sanséau
fonte
10
Você provavelmente está perdendo isso . (Note que um cobre-alvo .NET padrão tanto .NET e .NET Core, então não há realmente nenhuma necessidade para construir aqueles em separado.)
Jeroen Mostert
Obrigado @JeroenMostert, a adição do pacote NuGet System.Configuration.ConfigurationManager resolveu o problema. Agora, essa é provavelmente uma pergunta separada, mas como o .NET Core 2.0 é considerado compatível com o .NET Standard 2.0 se for necessário adicionar pacotes para preencher os bits ausentes?
Alex Sanséau
2
"Compatível com o .NET Standard 2.0" significa "se você criar isso para atingir o .NET Standard 2.0, ele será executado no .NET Core 2.0 (entre outras plataformas)". Isso não significa "se você criar isso para atingir o .NET Core 2.0, todas as APIs do .NET Standard 2.0 estarão disponíveis sem ação adicional". Se você construir isso para .NET Standard 2.0 e não será executado em .NET Core, então você tem motivo de queixa, mas acho que isso é só ir ao trabalho. (Eu não testei isso, porém.)
Jeroen Mostert
4
@ AlexSanséau Os pacotes NuGet não são poli-preenchimentos. Ao iniciar o trabalho no .NET Core, a Microsoft tomou a decisão de ativar as APIs, o que significa que seus aplicativos têm uma área menor. Eu recomendaria tomar algum tempo e assistir os vídeos que Immo Landwerth criou no .NET padrão ( youtube.com/... ) - ele é o PM na equipe .NET Padrão
Jamie Taylor
1
RE: It compiles fine when targeting .NET Standard 2.0 only- isso não pode estar correto, porque ConfigurationManagernão faz parte do .NET Standard (até agora, isso é verdade até a v.2.1).
G. Stoynev

Respostas:

268

Sim, ConfigurationManager.AppSettingsestá disponível no .NET Core 2.0 após a referência ao pacote NuGetSystem.Configuration.ConfigurationManager .

Os créditos vão para @JeroenMostert por me dar a solução.

Alex Sanséau
fonte
1
Você pode postar código do seu arquivo de configuração? Eu estou tentando descobrir como / onde eu definir uma variável global em .NET Núcleo 2.0
egmfrs
1
@egmfrs, você gostaria de reformular, por favor? Variáveis ​​globais existiriam na forma de propriedades estáticas de uma classe. Arquivos de configuração contém as configurações do aplicativo é o seu formato habitual:<add key="YourSetting" value="YourValue" />
Alex Sanseau
2
@ AlexSanséau, estou tentando descobrir onde posso definir os valores para AppSettings. web.config ou appsettings.json não funciona. Você poderia dar um exemplo onde definir o AppSettings? Obrigado.
Jan Deutschl
2
@JanDeutschl, ele deve ir para a seção appSettings do seu web.config ou app.config, como faria em um projeto .NET tradicional.
Alex Sanséau
8
Estou um pouco confuso. Isso lista .NET Framework 4.6como uma dependência. Isso significa que meu projeto `.NET Core` não é mais um Coreprojeto puro ?
James Poulose
20

Eu instalei System.Configuration.ConfigurationManager do Nuget no meu aplicativo .net core 2.2.

Eu então referência using System.Configuration;

Depois mudei

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

Até agora, acredito que isso esteja correto. 4.5.0 is typical with .net core 2.2

Eu não tive nenhum problema com isso.

Tom Stickel
fonte
Uma das correções fáceis de fazer para a migração. Alguns dos outros não são tão divertidos: /
Tom Stickel
você também criou um arquivo web.config?
214192 swedish_junior_dev #
2
não funciona para mim (.net core 3.1). ele não tem quaisquer dados de configuração se o acesso
arteny
@Arteny - nunca testei com o 3.1 - instalei o 3.1 e joguei com ele em casa - mas meu cliente atual não está querendo atualizar tão cedo.
Tom Stickel
9

Depois de configurar os pacotes, você precisará criar um app.config ou web.config e adicionar algo como o seguinte:

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

O conjunto de diretrizes mais recente é o seguinte: (em https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables )

Usar:

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

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

As configurações do aplicativo podem ser lidas a partir de variáveis ​​de ambiente, tanto no desenvolvimento local quanto na execução no Azure. Ao desenvolver localmente, as configurações do aplicativo vêm da Valuescoleção no arquivo local.settings.json . Nos dois ambientes, local e Azure, GetEnvironmentVariable("<app setting name>")recupera o valor da configuração do aplicativo nomeado. Por exemplo, quando você estiver executando localmente, "Meu nome do site" será retornado se o arquivo local.settings.json contiver { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } }.

A propriedade System.Configuration.ConfigurationManager.AppSettings é uma API alternativa para obter valores de configuração do aplicativo, mas recomendamos que você use GetEnvironmentVariablecomo mostrado aqui.

Nate Radebaugh
fonte
Para quem está tentando fazer isso, você obtém uma sintaxe semelhante ao exemplo da Microsoft, declarando o seguinte:using static System.Environment;
MattMakes
1

Você pode usar a configuração para resolver isso.

Ex (Inicialização.cs):

Você pode passar por DI para os controladores após esta implementação.

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
fonte