Как я могу использовать переменную среды Windows в моем .NET Core API? - PullRequest
0 голосов
/ 28 ноября 2018

Мы создаем приложение .NET Core 2.1 с проектом веб-API, который подключается к базе данных SQL Server.

Я пытаюсь понять, как правильно использовать переменные среды при хранении моегоСтроки подключения в наиболее безопасном месте.

Когда я услышал, что могу использовать переменные среды для хранения таких вещей, как строка подключения, которая звучит действительно хорошо.Это безопасно, и у нас могут быть разные переменные от разработчика к разработчику и в промежуточной и производственной среде.Это полезно, поскольку не все они имеют одинаковые имена для своего экземпляра SQL Server.

Но когда я теперь добавляю строку подключения к моим переменным среды Windows, например:

enter image description here

или через PowerShell, например, так:

setx CUSTOMCONNSTR_MyContextDb "Server=.\\MYSQLSERVER;Database=MyDb_local;Trusted_Connection=True;ConnectRetryCount=0"

И я пытаюсь получить это так:

var connectionString = Configuration.GetConnectionString("MyContextDb");

это не работает.Строка имеет значение null.

Я смогу заставить эту строку кода работать, только если добавлю переменную CUSTOMCONNSTR_MyContextDb и значение в переменные среды, когда перейду к свойствам проекта и затем введу переменную среды тамна вкладке «Отладка».Который в основном просто устанавливает их в файле launchSettings.json.Это вряд ли лучше, чем appsettings.json (или это?).

Я неправильно понял использование переменных среды в .NET Core?Могу ли я не использовать определенные в Windows переменные среды?Или я могу использовать только реальные переменные среды Windows на своем сервере IIS?

Похоже, что я могу, потому что я вижу список из более чем 80 переменных среды, когда я отлаживаю и смотрю на объект конфигурации.

Для справки этот пост с коротким клипом на YouTube помог мне лучше понять концепции, связанные с этим, но я не до конца понимаю все, надеюсь, вы поможете.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Я думаю, что здесь есть явное недопонимание «env vars».Говоря о конфигурации отдельного ASP-приложения, тем более что Docker - это вещь и т. Д. Переменная среды означает переменную конфигурации для этого конкретного приложения, которая хранится в appsettings.json или launchsettings.json.

«Windows env vars» здесь не подразумевается и обычно не учитывается для приложений ASP Core по нескольким причинам.

Ваш фрагмент там:

var connectionString = Configuration.GetConnectionString("MyContextDb");

явно считывает данные из раздела «ConnectionString» в appsettings.json.Вы не можете перезаписать это.

На мой взгляд, лучший способ иметь настройки «на пользователя» - использовать один глобальный appsettings.json со значениями, действительными для всех разработчиков и пользователей, и у каждого пользователя есть свой собственный appsettings_develop.json, содержащий его личную строку подключения искоро.Личный добавляется в gitignore и не передается, а только живет на компьютере пользователя.

Я бы посоветовал не использовать какие-либо ENV-переменные из хост-системы (например, ваши пользовательские Env-переменные Windows), так как вам нужно убедиться, что они существуют везде, где вы хотите использовать свое приложение, если вы его поместите.в докере контейнер докера должен иметь их и т. д., не может фиксировать env-переменные, используя github или tfs.Конфиги Json - ваш лучший вариант, я бы сказал

0 голосов
/ 29 ноября 2018

Код для метода GetConnectionString выглядит следующим образом: this :

public static string GetConnectionString(this IConfiguration configuration, string name)
{
    return configuration?.GetSection("ConnectionStrings")?[name];
}

Это показывает, что сама строка подключения должна находиться внутри секции ConnectionStrings.Поскольку ваш экземпляр IConfiguration представляет собой словарь, который по сути является словарём от string до string, в конечном итоге мы ищем ключ с именем ConnectionStrings:[name].

Чтобы решить проблему с не найденной переменной среды, вы должны назвать это ConnectionStrings:MyContextDb (вы также можете использовать __ вместо :, но : встречается гораздо чаще).

Когда я впервые прочитал ваш вопрос, я был удивлен, что добавлениеэто в файл launchSettings.json заставило его работать, но с тех пор я обнаружил, что это значение CUSTOMCONNSTR_MyContextDb преобразуется в ConnectionStrings:MyContextDb для вас.Вы можете подтвердить это, используя что-то вроде этого:

new ConfigurationBuilder()
    .AddEnvironmentVariables()
    .Build()
    .AsEnumerable()
    .ToList()
    .ForEach(x => Console.WriteLine("{0} => {1}", x.Key, x.Value));

Это очень дешевый и удобный способ просмотра всех пар ключ / значение, которые были добавлены в экземпляр IConfiguration.

0 голосов
/ 29 ноября 2018

Configuration.* читает из файлов конфигурации приложения.Вы ищете

Environment.GetEnvironmentVariable("CUSTOMCONNSTR_MyContextDb")

На вопрос «Где хранить строки подключения» ответить не так просто.Это немного вопрос мнения, и, как обычно, , это зависит .

Если бы единственный бит данных конфигурации, который, как ожидалось, изменится, я бы подумал придерживаться только настроек приложений.JSON для удобства.Если бы больше вариантов конфигурации вызывало беспокойство, например, запуск локально и в Azure, я мог бы рассмотреть переопределяющий подход, такой как this. Еще одним соображением было бы количество членов команды, работающих над одним проектом.У каждого может быть свой собственный экземпляр локальной базы данных с различными настройками.В этом случае SecretManager может быть хорошим вариантом.

Существует множество инструментов и методов для безумия, как вы, вероятно, видели до сих пор.К сожалению, нет универсального решения, которое я могу рекомендовать выше других.Я бы придерживался того, что вы сейчас пытаетесь, пока оно не работает.

Я не верю, что вы в целом неправильно поняли концепцию, за исключением «переменных среды, определенных в Windows» и другой фразы «реальная среда».переменные на моем сервере IIS ".Windows и IIS все еще являются программным обеспечением, написанным кем-то другим.Они не имеют большего или меньшего значения, чем ваши переменные окружения.

Я никогда не устанавливал переменные среды на упомянутой вами вкладке, поэтому я понятия не имел, что хранится в файле launchSettings.json.Мне придется больше об этом узнать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...