Доступен ли ConfigurationManager.AppSettings в .NET Core 2.0?

153

У меня есть метод, который считывает настройки из моего файла конфигурации следующим образом:

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.

Что мне не хватает?

Алекс Сансо
источник
12
Вы, вероятно, упускаете это . (Обратите внимание, что цель .NET Standard охватывает как .NET, так и .NET Core, поэтому действительно нет необходимости создавать их отдельно.)
Йерун Мостерт,
Спасибо @JeroenMostert, добавление пакета NuGet System.Configuration.ConfigurationManager разрешило проблему. Теперь, вероятно, это отдельный вопрос, но как .NET Core 2.0 считается совместимым с .NET Standard 2.0, если нужно добавлять пакеты для полифилирования недостающих бит?
Alex Sanséau 01
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 Ядра, то у вас есть причины для жалоб, но я думаю , что это просто будет работать. (Я не проверял это, однако.)
Йерун Мостерт
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).
Г. Стойнев

Ответы:

284

Да, 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? Спасибо.
Ян
2
@JanDeutschl, он должен войти в раздел appSettings вашего web.config или app.config, как и в случае с традиционным .NET-проектом.
Alex Sanséau 02
8
Я немного сбит с толку. Это действительно список .NET Framework 4.6как зависимость. Означает ли это, что мой проект .NET Core больше не является чистым Coreпроектом?
Джеймс Пулозе
21

Я установил System.Configuration.ConfigurationManagerNuget в свое приложение .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 01
3
это не работает для меня (.net core 3.1). у него нет данных настроек, если доступ
arteny
@Arteny - я никогда не тестировал его с 3.1 - я установил 3.1 и играл с ним дома - но мой текущий клиент не хочет обновляться в ближайшее время.
Том Стикель
11

После настройки пакетов вам нужно будет создать app.config или web.config и добавить что-то вроде следующего:

<configuration>
  <appSettings>
    <add key="key" value="value"/>
  </appSettings>
</configuration>
Шарпиро
источник
8

Последний набор рекомендаций выглядит следующим образом: (из 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>")извлекает значение указанного параметра приложения. Например, при локальном запуске будет возвращено «Имя моего сайта», если ваш файл 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);

       ...
    }
Фредерико Фрейтас
источник