Чи доступний ConfigurationManager.AppSettings в .NET Core 2.0?


143

У мене є метод, який читає налаштування з мого конфігураційного файлу так:

var value = ConfigurationManager.AppSettings[key];

Він добре компілює лише націлювання .NET Standard 2.0.

Зараз мені потрібно кілька цілей, тому я оновив файл свого проекту:

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

Але тепер компіляція не вдається для netcoreapp2.0отримання наступного повідомлення про помилку:

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

Окремо я створив нову консольну програму .NET Core 2.0 (націлював лише на це .NET Core 2.0 цього разу), але, схоже, її немає ConfigurationManagerв просторі імен System.Configuration.

Я дуже розгублений, тому що він доступний під .NET Standard 2.0, тому я б очікував, що він буде доступний у .NET Core 2.0, оскільки .NET Core 2.0 є .NET Standard 2.0.

Що я пропускаю?


11
Вам, мабуть, цього не вистачає . (Зверніть увагу, що ціль .NET Standard охоплює і .NET, і .NET Core, тому насправді також не потрібно будувати їх окремо.)
Jeroen Mostert

Дякуємо @JeroenMostert, додавши пакет NuGet System.Configuration.ConfigurationManager вирішив проблему. Тепер це, мабуть, окреме питання, але як .NET Core 2.0 вважається .NET Standard 2.0 сумісним, якщо потрібно додати пакети для поліфактування відсутніх бітів?
Alex Sanséau

2
"Сумісний .NET Standard 2.0" означає "якщо ви будуєте це для націлювання .NET Standard 2.0, він буде працювати на .NET Core 2.0 (серед інших платформ)". Це не означає, що "якщо ви будуєте це для націлювання .NET Core 2.0, всі API .NET Standard 2.0 будуть доступні без подальших дій". Якщо ви будуєте це на .NET Standard 2.0 і він не працюватиме на .NET Core, то у вас є скарги, але я думаю, що це просто працює. (Я його ще не перевіряв.)
Jeroen Mostert

4
@ AlexSanséau Пакети NuGet не є полізаливними. Розпочавши роботу над .NET Core Microsoft прийняла рішення зробити вибір API, тобто ваші програми мають менший відбиток. Я порекомендував би трохи проглянути та переглянути відео, створене Іммо Ландвертом на .NET Standard ( youtube.com/… ) - він є прем'єр-міністром у команді .NET Standard
Джеймі Тейлор

1
RE: It compiles fine when targeting .NET Standard 2.0 only- це не може бути правильним, оскільки ConfigurationManagerце не є частиною .NET Standard (поки що це справедливо до v.2.1).
Г. Стойнев

Відповіді:


268

Так, ConfigurationManager.AppSettingsдоступний в .NET Core 2.0 після посилання на пакет NuGet System.Configuration.ConfigurationManager.

Кредити надходять до @JeroenMostert за те, що він дав мені рішення.


1
Чи можете ви надіслати код з вашого конфігураційного файлу? Я намагаюся розібратися, як / де я встановив глобальну змінну в .NET Core 2.0
egmfrs

1
@egmfrs, чи не заперечуєте ви переформулювати слово? Глобальні змінні існували б у вигляді статичних властивостей класу. Налаштування файлів містить налаштування програм - це їх звичайний формат:<add key="YourSetting" value="YourValue" />
Alex Sanséau

2
@ AlexSanséau, я намагаюся зрозуміти, де я можу встановити значення для AppSettings. web.config або appsettings.json не працює. Чи можете ви навести приклад, де встановити AppSettings? Дякую.
Jan Deutschl

2
@JanDeutschl, він повинен перейти в розділ appSettings вашого web.config або app.config, як це було б зроблено для традиційного проекту .NET.
Алекс Сансо

8
Я трохи розгублений. Це вказується .NET Framework 4.6як залежність. Це означає, що мій проект `.NET Core` вже не є чистим Coreпроектом?
Джеймс Поулоз

20

Я встановив System.Configuration.ConfigurationManagerз Nuget в свою програму .net core 2.2.

Я тоді посилаюсь using System.Configuration;

Далі я змінився

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

Поки я вважаю, що це правильно. 4.5.0 is typical with .net core 2.2

У мене з цим не виникало жодних проблем.


Одне з простих виправлень, яке потрібно зробити для міграції. Деякі з інших не такі веселі: /
Том

Ви також створили файл web.config?
swedish_junior_dev

2
він не працює для мене (.net core 3.1). у нього немає даних про налаштування, якщо доступ
arteny

@Arteny - я ніколи не тестував його з 3.1 - я встановив 3.1 і грав з ним вдома, - але мій поточний клієнт не хоче оновлюватись найближчим часом.
Том Стікель

9

Після налаштування пакетів вам потрібно буде створити або app.config або web.config і додати щось на зразок наступного:

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

7

Останній набір вказівок: (від https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables )

Використання:

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

З документів:

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

Налаштування програми можна читати зі змінних оточуючих середовищ як при локальній розробці, так і під час роботи в Azure. Під час розробки локально налаштування програми надходять із Valuesколекції у файлі local.settings.json . В обох середовищах, локальній та Azure, GetEnvironmentVariable("<app setting name>")отримує значення названого параметра програми. Наприклад, якщо ви працюєте локально, "My Name Site" буде повернуто, якщо ваш файл local.settings.json містить { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } }.

System.Configuration.ConfigurationManager.AppSettings властивість є альтернативою API для отримання значення налаштувань програми, але ми рекомендуємо використовувати , GetEnvironmentVariableяк показано тут.


Для тих, хто намагається це випробувати, ви отримуєте синтаксис, подібний до прикладу Microsoft, заявляючи про це:using static System.Environment;
MattMakes

1

Ви можете скористатися конфігурацією для вирішення цього питання.

Наприклад (Startup.cs):

Після цієї реалізації ви можете передати DI контролерам.

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

       ...
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.