Невозможно добавить файл пользовательских настроек в Asp. Net Core 3.1 WebApi - PullRequest
1 голос
/ 17 февраля 2020

Я пишу WebApi для отслеживания действий моего щенка (небольшие перерывы, обучение ящиков и т. Д. c). API имеет интерфейсный компонент, написанный на Blazor, но это не является частью этого вопроса.

В моих проектах github я никогда не использую файл appsettings. json из-за боязни случайного его передачи и, таким образом, раскрытия каких-либо секретов. Вместо этого я хотел добавить свой собственный файл appsettings следующим образом:

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(config => {
                    var basePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                    var fileName = "puppytrackersettings.json";
                    var fullPath = Path.Combine(basePath, fileName);

                    if(File.Exists(fullPath))
                    {
                        config.SetBasePath(basePath);
                        config.AddJsonFile(fileName, optional: true);
                    }
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

Таким образом, файл настроек можно сохранить в папке «Мои документы» («/» на linux), надежно заправив далеко от исходного кода.

ПРОБЛЕМА Проблема заключается в том, что конфигурация обновляется только с этим добавленным файлом json в методе CreateHostBuilder () . Как только конфигурация активируется в Startup.cs , конфигурация возвращается к конфигурации по умолчанию. Я вижу, что для обеспечения конфигурации перед входом в CreateHostBuilder () устанавливается значение 5, затем он увеличивается до 6 после добавления моего json файла, но затем, когда запускается Startup.ConfigureServices () , Конфигурация снова вернулась к 5.

Я пробовал множество способов создания конфигурации для webapi, но ни один из них не работает.

ВРЕМЕННОЕ РЕШЕНИЕ Пока что мой обходной путь - использовать секреты приложений в VS, но поскольку некоторые параметры, такие как ключ телеметрии Application Insights, являются общими, выполнить репликацию через все микросервисы очень сложно, поскольку я не могу указать на существующее приложение секрет.

Кто-нибудь знает, что я делаю неправильно, или как это сделать правильно?

Версия. Net Ядро 3.1.101 Visual Studio: 16.4.5

1 Ответ

2 голосов
/ 17 февраля 2020

Правильно ли я понимаю, что вы хотите хранить некоторые конфиги (например, пароли или API-ключи) в отдельной папке? Поэтому очень разумно не хранить такие данные в git-хранилище.

ПЕРВОЕ РЕШЕНИЕ

Знаете ли вы о AddInMemoryCollection или AddEFConfiguration или AddCommandLine или AddEnvironmentVariables?

Этим способом вы можете расширить свой файл настроек значениями из базы данных, параметров командной строки или переменных среды.

На вашем месте я буду использовать AddEnvironmentVariables ,

Подробнее см. Здесь https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

ОДИН БОЛЬШЕ РЕШЕНИЯ

Вы можете добавить файл с указанием c данных вам код и игнорировать его в GIT. Таким образом, если этот файл будет необязательным, ваше приложение не сможет работать, но у вас будет возможность изменить конфигурацию.

Для этого сделайте что-то вроде этого:

public IConfiguration Configuration { get; set; }
public IHostingEnvironment Environment { get; set; }

public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
   Environment = environment;
   Configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.secrets.json")
            .Build();
}

и добавьте настройки приложения. секреты. json вам git игнорировать

ОДНО БОЛЬШЕ РЕШЕНИЯ

Итак, почему вы используете SetBasePath? Почему вы не используете AddJsonFile с полным путем? Как это:

if(File.Exists(fullPath))
{
    config.AddJsonFile(fileName, optional: true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...